一个关于CRC的怪事

zhouqingprsc zhouqingprsc 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
一下是一个CCITT的CRC校验的代码。多项式是1021。寄存器初始值是0xFFFF。

unsigned short cal_crc(unsigned char *ptr, unsigned char len)
{
unsigned char i;
unsigned short crc = 0xFFFF;
while(len--)
{
for(i = 0x80; i != 0; i >>= 1)
{
if(crc & 0x8000)
{
crc <<= 1;
crc ^= 0x1021;
}
else
{
crc <<= 1;
}
if((*ptr & i) != 0)
{
crc ^= 0x1021;
}
}
ptr++;
}
return(crc);
}


我发现在中间一个判断中不管是不是都要执行一句crc <<= 1;。我就把这句提出来。代码变成了下面的样子:

unsigned short cal_crc(unsigned char *ptr, unsigned char len)
{
unsigned char i;
unsigned short crc = 0xFFFF;
while(len--)
{
for(i = 0x80; i != 0; i >>= 1)
{
crc <<= 1;
if(crc & 0x8000)
{
crc ^= 0x1021;
}
if((*ptr & i) != 0)
{
crc ^= 0x1021;
}
}
ptr++;
}
return(crc);
}


奇怪的是我用这两段程序给0x01010101计算CRC。上面一段程序的结果是0xE654。下面一段程序的结果是0xC70E。
为什么?为什么?为什么?为什么?为什么?为什么?为什么?为什么?
...全文

相关推荐

各种CRC生成工具,包括CRC8,CRC16,CRC-CCITT,CRC32

它使用一个8位的生成多项式,计算过程相对简单,常用于嵌入式系统和低速通信中。2. **CRC16**:这是16位的CRC校验,提供比CRC8更高的错误检测能力,适合处理更大数据量的传输。

feixiangxtu

11《深入解析CAN总线:数据场、控制场、CRC场逐字段精讲》

本文深入剖析了CAN总线协议中的数据场机制,揭示了DLC编码、字节序和位填充等关键细节。文章通过实际调试案例指出:DLC值在经典CAN和CAN FD中存在非线性映射关系,数据场字节序存在英特尔序和摩托罗拉序两种常见排列方式,位填充机制会导致实际传输位数超出预期。作者建议工程师应显式定义数据布局、对DLC值进行钳位处理、预计算位填充影响,并在协议文档中明确字节序规范。这些深入底层的技术细节对于解决CAN通信中的疑难杂症至关重要,特别是当出现数据解析异常时,需要从物理层比特流层面进行逐位分析。

人工智能科技211

避坑指南:USR-LG206与LG210 LoRa组网配置全流程(附Python CRC校验代码详解)

本文详细解析了USR-LG206与LG210 LoRa组网配置的全流程,包括硬件配置、数据链路层优化及Python CRC校验代码的工业级改造。通过真实案例和实用代码示例,帮助开发者避开常见配置陷阱,提升物联网项目的稳定性和数据传输可靠性。

懂车天天答

Modbus协议避坑指南:03功能码的5个常见错误及解决方法(附Wireshark抓包分析)

本文深入解析Modbus协议中03功能码的5个常见错误及解决方法,包括地址偏移、CRC校验失败、响应超时、字节顺序错乱和功能码冲突。通过Wireshark抓包分析,提供实用解决方案和代码示例,帮助开发者有效规避工业通信中的典型陷阱。

weixin_30369041

CRC8/CRC16/CRC32常见几个标准的算法及C语言实现

它通过在数据后面附加一个校验码,使得数据发生错误时,接收方可以通过计算校验码来发现错误。CRC8、CRC16和CRC32分别代表使用8位、16位和32位的CRC校验。

slimmm
评论 8
收藏 已收藏
分享
返回顶部
zhouqingprsc
C# 111,128 成员 642,536 内容