
Сообщение от
Vslav
Вот текст программки которая соответствует извлеченному алгоритму
Для прикола - ещё один вариант того же алгоритма, использующий только сдвиги:
Код:
unsigned short int crc16( unsigned short crc, unsigned char data )
{
printf("\r\n %02X ( %04X,", data, crc);
crc = ~crc;
crc = unsigned char (crc >> 8) | (crc << 8);
crc ^= data;
crc ^= unsigned char (crc) >> 4;
crc ^= crc << 12;
crc ^= unsigned char (crc) << 5;
crc = ~crc;
printf(" %04X )", crc );
return crc;
}
Результат запуска:
Код:
A1 ( 0000, BBC4 )
A1 ( BBC4, 6974 )
30 ( 6974, A1D3 )
31 ( A1D3, 4EB6 )
32 ( 4EB6, 1714 )
33 ( 1714, 6EE9 )
CRC: 9116
A1 ( 0000, BBC4 )
A1 ( BBC4, 6974 )
30 ( 6974, A1D3 )
31 ( A1D3, 4EB6 )
32 ( 4EB6, 1714 )
33 ( 1714, 6EE9 )
91 ( 6EE9, E9FF )
16 ( E9FF, FFFF )
TMP: FFFF CRC OK
---------- Post added at 22:20 ---------- Previous post was at 22:04 ----------
В оригинале - это алгоритм CRC-16:
Код:
CRC-16
width=16 poly=0x1021 init=0xFFFF refin=false refout=false
xorout=0x0000 check=0x29B1
Код:
unsigned short int crc16( unsigned short crc, unsigned char data )
{
printf("\n %02X ( %04X,", data, crc);
crc = unsigned char (crc >> 8) | (crc << 8);
crc ^= data;
crc ^= unsigned char (crc) >> 4;
crc ^= crc << 12;
crc ^= unsigned char (crc) << 5;
printf(" %04X )", crc );
return crc;
}
int main(int argc, char *argv[])
{
unsigned short crc, tmp;
crc = 0xFFFF;
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0xA1);
crc = crc16(crc, 0x30);
crc = crc16(crc, 0x31);
crc = crc16(crc, 0x32);
crc = crc16(crc, 0x33);
tmp = crc;
printf("\nCRC: %04X", tmp);
}