|
crc16_ccitt_false和CRC16_XMODEM
网上的例子全是C语言的,找到一个照易语言的crc16_MODBUS,进行仿写,crc16_ccitt可以正常出结果,但是crc16_ccitt_false和CRC16_XMODEM的结果明显不对
C语言:
uint16_t crc16_ccitt_false(uint8_t *data, uint_len length)
{
uint8_t i;
uint16_t crc = 0xffff; //Initial value
while(length--)
{
crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint6_t)(*data)<<8; data++;
for (i = 0; i < 8; ++i)
{
if ( crc & 0x8000 )
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
}
return crc;
}
uint16_t crc16_xmodem(uint8_t *data, uint_len length)
{
uint8_t i;
uint16_t crc = 0; // Initial value
while(length--)
{
crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint16_t)(*data)<<8; data++;
for (i = 0; i < 8; ++i)
{
if ( crc & 0x8000 )
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
}
return crc;
}
改写的crc16_ccitt:
变量名 | 类 型 | 静态 | 数组 | 备 注 | temp | 字节集 | | | crc | 整数型 | | | table | 整数型 | | 256 | i | 整数型 | | | return | 文本型 | | |
temp = 字节集_十六进制到字节集 (data )变量循环首 (0, 255, 1, i )crc = i 变量循环首 (1, 8, 1, )如果 (位与 (crc, 1 ) ≠ 0 )crc = 位异或 (右移 (crc, 1 ), 33800 )crc = 右移 (crc, 1 )变量循环尾 ()table [i + 1 ] = crc 变量循环尾 ()crc = 0 变量循环首 (1, 取字节集长度 (temp ), 1, i )crc = 位异或 (右移 (crc, 8 ), table [位异或 (temp [i ], 位与 (crc, 255 )) + 1 ])变量循环尾 ()return = 取文本右边 (进制_十到十六 (crc, 真), 4 )返回 (return )
|
|