CRC16-ITU доказательство
Ребята. Я использую проверку CRC16-ITU для сравнения некоторых данных, но она не совпадает, когда я сравнивал CRC16-ITU и пакетные данные с CRC16 с устройства.
Вот таблица CRC16-ITU.
U16 crctab16[256] = { 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0xxx0xx0xx0xxx0xx0xx0xx0xxx0xx0xxx0xx0xxx0xx0xx0xx0xx0xx0xx0xx как как: как следует как:, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0x6x0x0x0x6x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x10x0x0x10x10x0x0x10x10x0x10x10x0x12009106106106 0x6106 0x6106 0x6106 0x6106, 0x8306, 0x8306, 0x6106, 0x6106, 0x6106, 0x6106, 0x6408, 0x6408, 0x6408, 0x6408, 0x6408, 0x6409 05, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b, 0x6xf0x0xf0x0xf0x0xf0x0xf0x0xf0b0x0xf0b0x0x0xf0b0x0xf0e0xa0x0xf0e0xa0e0xa0e0xa0e0e0xa0e0e0e0xa0x0, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf 0, 0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x для веб-сайта., 0x dcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x5240, 0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x5x0x0x0x0x0x. 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x 8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78};
================================================== ======================
И я использовал этот код для того, чтобы сделать crc
u16 fcs16(u16 fcs, unsigned char *cp, int len)
{
while(len--)
fcs = (fcs >> 8) ^ crctab16[(fcs ^ *cp++) & 0xff];
return(fcs);
}
Вот пример пакетных данных с устройства
7e 01 11 97 17 7e
97 17 означает CRC16 как метод с прямым порядком байтов.
когда я использую код CRC16-ITU в своем проекте, я получаю "4edf"
Я совершенно не понимаю, почему между этими данными есть несоответствие.
Если у вас есть идеи, пожалуйста, прокомментируйте для меня
Спасибо
1 ответ
Ваш CRC 0x4edf соответствует алгоритму CRC-16/X-25 (используя нотацию из http://reveng.sourceforge.net/crc-catalogue/) в последовательности байтов 7e 01 11
, Если вы вычислите CRC более 01 11
вы должны получить 0x1797 как 16-битное значение (или 97 17
как два байта).