无法验证CRC目录中10款模型的residue参数,求问题排查
CRC Residue参数验证失败问题(特定模型)
此问题关联我此前提出的关于residue参数的问题:CRC residue verification fails
按照之前问题回答中的指引,我已成功验证CRC目录中几乎所有模型的residue参数,但以下10款模型无法得到指定residue:
- CRC-4/INTERLAKEN
- CRC-5/EPC-C1G2
- CRC-5/USB
- CRC-6/CDMA2000-A
- CRC-6/CDMA2000-B
- CRC-10/CDMA2000
- CRC-11/FLEXRAY
- CRC-12/CDMA2000
- CRC-30/CDMA
- CRC-31/PHILIPS
我使用RevEng工具简化CRC计算,以CRC-12/CDMA2000为例的操作流程如下:
reveng.exe -m crc-12/cdma2000 -c 313233343536373839 0d4d # Check: PASS reveng.exe -m crc-12/cdma2000 -c 0313233343536373839d4d -x 0 0edc # Residue: FAIL (expected: 0000)
我先计算标准测试消息b'123456789'(十六进制为313233343536373839)的CRC,得到0d4d,与校验参数一致。随后以大端模式(因refin=False)将该12位CRC追加至原消息,得到0313233343536373839d4d,并计算无最终异或(-x 0参数)的CRC。其他模型均可得到与residue参数一致的结果,但上述10款模型无法实现。我还尝试不同起始消息测试,发现不同消息+CRC输入的residue结果不一致。
请问我哪里操作有误?
以下是我用于将CRC追加至消息的Python函数:
def append(buffer: bytes, crc: int, width: int, refin: bool) -> bytes: # Number of bytes in the buffer and the CRC b_buf: int = len(buffer) b_crc: int = -(width // -8) # ceil if refin: message = (crc << (b_buf * 8)) | int.from_bytes(buffer, byteorder := 'little') else: # not refin message = (int.from_bytes(buffer, byteorder := 'big') << width) | crc return message.to_bytes(b_buf + b_crc, byteorder)
内容的提问来源于stack exchange,提问作者Marko Gulin
相关产品推荐
相关产品推荐

