基于初始种子与查表法的CRC-3实现咨询:13位消息CRC计算疑问
如何用8位格式的CRC-3查表计算3位CRC
首先明确:你找到的网站生成的8位表完全可以用来计算3位CRC,因为表中每个值的低3位就是对应3位CRC的结果,高位只是补0的冗余位,不影响计算。前提是你生成表时的参数必须和你的需求完全匹配:
- CRC宽度:3
- 生成多项式:0xB(二进制
1011,对应多项式x³+x+1) - 初始值:0x5
- 输入/输出反转:按你的实际约定(通常默认不反转,即从消息最高位开始处理)
- 最终异或值:0x0(无额外异或)
具体操作步骤
1. 初始化CRC寄存器
将CRC寄存器设为初始种子0x5(二进制101),按8位格式处理时就是0x05(高位补0,不影响结果)。
2. 处理13位消息
由于消息是13位,拆分为1个完整字节(8位)和1个5位片段处理:
处理前8位(完整字节)
- 取消息前8位作为字节
byte1 - 计算查表索引:
index = (crc ^ byte1) & 0xFF - 从表中取出对应值,更新CRC为该值的低3位:
crc = crc_table[index] & 0x07
处理剩余5位
逐位从最高位到最低位处理(和前面的字节处理顺序一致):
对于每一位bit:
- 取出当前CRC的最高位:
msb = (crc >> 2) & 1 - 将CRC左移1位并加入当前消息位,保留低3位:
crc = ((crc << 1) | bit) & 0x07 - 如果
msb为1,将CRC与0x03(二进制011,对应生成多项式x³+x+1的低3位)异或:crc ^= 0x03
3. 获取最终结果
处理完所有位后,CRC寄存器中的值就是3位宽的CRC结果(范围0~7)。
验证建议
可以用手动计算小例子验证结果,比如用全0的13位消息,按步骤计算后对比查表法的输出,确保参数和操作正确。
内容的提问来源于stack exchange,提问作者milan muller
相关产品推荐
相关产品推荐

