Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > расчет CRC-16


Автор: ds474 31.5.2007, 14:18
 Помогите с расчетом  crc-16. До этого ни разу не имел дело с этим.
Вот описание расчета КС:
Поле  контрольной  суммы  содержит  значение CRC-16 (Cyclic Redundancy Check). CRC-16  представляет собой 16-разрядный остаток от деления  сообщения (поля  адреса,  функции  и  данных),  предварительно умноженного  на  полином x^16  (сдвигом  на 16  бит  влево),  на  полином, выраженный двоичным числом 11000000000000101B. 

Вот пример для него(вроде праивльный...):
Сообщение: 03 03 02 01 01 
КС:01 D4

Я сам написал попробовал реализовать 
тот алгоритм,  но он не считает правильно :(
Код


void CRC(char *szStr, unsigned uLen)
{
    //char sets
    unsigned short CRC=0;
    for(int i=0;i<uLen;i++)
        CRC+=((szStr[i]<<16)%0x18005) ;
    char crc[2]={0,0};
     CRC&=0xFFFF;
    sprintf(crc,"%s",CRC);
    //printf("%x",CRC);
    strcat(szStr,crc);

}


жду помощи...

Автор: korbian 1.6.2007, 09:21
не все так просто, как вы изложили
См. atach.
и еще вот: http://www.slavasoft.com/fastcrc/help-online/htmlpages/ccrc16_overview.htm

Автор: ds474 1.6.2007, 11:23
Спасибо за ответ. Очень непростой алгоритм.

Автор: korbian 1.6.2007, 11:28
пожалуйста.

Автор: Artemon 2.6.2007, 14:33
Что-то намудрили с CRC, все намного проще:
Код

#include <stdio.h>
//---------------------------------------------------------------------------
  class MY_CRC
{
  public:
        MY_CRC();
        unsigned short CRC(unsigned short crc, unsigned char ch);

        bool CrcIsCorrect(char* Data, int DataSize, unsigned short crc);
        
  private:
};


Код

#include "UMY_CRC.h"

//---------------------------------------------------------------------------
  MY_CRC::MY_CRC()
{
}
//---------------------------------------------------------------------------
  unsigned short MY_CRC::CRC(unsigned short crc, unsigned char ch)
{
        static const unsigned int crcPoly = 0x11021;

        int n;
        unsigned long m;

        m = ((unsigned long)crc << 8) | ch;
        for (n = 0; n < 8; n++)
                if ((m <<= 1) & 0x1000000)
                        m ^= ((unsigned int)crcPoly << 8);

        return (unsigned short)(m >> 8);
}
//---------------------------------------------------------------------------
  bool MY_CRC::CrcIsCorrect(char* Data, int DataSize, unsigned short crc)
{
  unsigned short tmpCRC = 0;

  if( !Data || !DataSize ) return false;

  for( int k = 0; k < DataSize; k++ )
     tmpCRC = CRC(tmpCRC, Data[k]);

  tmpCRC = CRC(tmpCRC, crc&0x00FF);
  tmpCRC = CRC(tmpCRC, crc>>8);

  //return tmpCRC == 0 ? true: false;
  return true;
}
//---------------------------------------------------------------------------

Автор: willhunting2 15.3.2010, 00:12
Почему-то
 Cannot open include file: 'UMY_CRC.h': No such file or directory
Error executing cl.exe.

Автор: GremlinProg 15.3.2010, 16:45

M
GremlinProg
Тема перемещена из раздела C/C++: Системное программирование и WinAPI

Автор: chaos 16.3.2010, 09:22
Цитата(ds474 @  31.5.2007,  11:18 Найти цитируемый пост)
crc-16

Цитата(ds474 @  31.5.2007,  11:18 Найти цитируемый пост)
11000000000000101


или я чего-то упустил или хз, но не смущает ли вас полином? чот он не 16 битный.

по теме - не изобретать велосипед. "все уже украдено до вас" (с) http://www.boost.org/doc/libs/1_42_0/libs/crc/crc.html

Добавлено через 36 секунд
топикстартер мог бы не приводить набор 1 и 0, а дать полином в нормальнов виде в хексе

Автор: EnergoHokum 19.3.2010, 16:17
Код

typedef unsigned short crc16_type;
//--------------------------------------------------------------------------------
template <typename InputIterator>
crc16_type CRC16(InputIterator first,InputIterator last)
{
 crc16_type poly=0x1021;
 crc16_type crc16=0xFFFF;
 for(;first != last;++first)
 {
  crc16 ^= *first << 8;
  for(int i=0;i < 8;++i)
  { crc16=crc16 & 0x8000 ? (crc16 << 1) ^ poly : crc16 << 1; }
 }
 return crc16;
}

Я так сделал, на контрольной последовательности даёт верный результат.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)