1

我已经迭代了很多文章-由于某种原因,我找不到任何描述必须是一个简单过程的文章:如何将计算出的 CRC 与原始消息结合起来,以便再次计算 CRC 得到 0(=签出正确)?我确实找到了几个使用“普通”计算的示例(只有 2 位或 3 位 CRC),但没有使用诸如[crcmod][1](Python 库)之类的库函数的示例。

这是我写的一个简单的程序来检查它:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#

import crcmod

def test_cycle():
    test_str = b"123456789"
    orig_msg = test_str
    print("Original message: {:s}".format(orig_msg.hex()))

    #~ crc_calc = crcmod.predefined.Crc('xmodem')
    crc_calc = crcmod.Crc(
                0x11021,
                rev = False,
                initCrc = 0x0000,
                xorOut = 0x0000)

    crc_calc.update(orig_msg)
    print("CRC: {:04x}".format(crc_calc.crcValue))

    lo = crc_calc.crcValue & 0xff
    hi = crc_calc.crcValue >> 8
    new_msg = test_str + bytes((hi, lo))
    print("Crc appended: {:s}".format(new_msg.hex()))

    crc_calc.update(new_msg)
    print("CRC: {:04x}".format(crc_calc.crcValue))


def main(args):
    test_cycle()
    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

有一些注释行,来自不同字节顺序的实验。该程序的结果是:

Original message: 313233343536373839
CRC: 31c3
Crc appended: 31323334353637383931c3
CRC: 00ef

第一个 CRC ( ) 似乎与xmodem-CRC 的预期值31C3相符。我尝试以多种方式将获得的 CRC 与原始字符串结合起来,但从未获得“0”。我在这里错过了什么吗?

4

2 回答 2

2

crc_calc.update(new_msg)将 的全部内容添加new_msg到 CRC。由于crc_calc已经拥有 的结果313233343536373839,因此您正在有效地计算 CRC,31323334353637383931323334353637383931c3这确实是00ef

要仅将两个字节添加到计算中,请使用

crc_calc.update(bytes((hi, lo)))

或者,使用 的新实例,或在进行新计算之前crcmod.Crc()重置现有实例的crcValue

crc_calc.crcValue = 0
crc_calc.update(new_msg)

两者都会给你一个结果 0

于 2018-07-06T07:28:29.817 回答
2

那些到达这个问题的人的一些背景,想知道附加 CRC。

如果 CRC正确地附加到它是 CRC 的消息中,并且消息或 CRC 中没有引入错误,则整个事物的 CRC 将是一个仅取决于该 CRC 定义的常数。

正确附加 CRC,需要注意位顺序。对于由 提供的通用 CRC 定义crcmod,如果rev为假,则必须首先附加最高有效位。如果rev为真,则必须首先附加最低有效位。对于面向字节的消息,这意味着首先 CRC 的宽度必须是 8 位的倍数(顺便说一句,这是crcmod允许的),并且 CRC 以大端或小端顺序附加分别订购。

结果常数并不总是零,这取决于 CRC 的定义。如果CRC的值为零,则为零xorOut否则,常数是n 个零位的 CRC,其中n是 CRC 的宽度,并且提供的初始 CRC 值为零(not initCrc)。例如,对于标准 CRC-32,以 little-endian 顺序附加其 CRC-32 的消息的 CRC-32 始终为0x2144df1c

对于这个特定的问题,CRC 以大端顺序附加,因此31 c3,结果消息 + CRC 的 CRC 为零。

于 2018-07-07T02:51:42.113 回答