【问题标题】:CRC of input data shorter than poly width输入数据的 CRC 小于 poly 宽度
【发布时间】:2018-08-27 09:31:30
【问题描述】:

我正在研究如何使用 VBA 在 Excel 中实现 CRC 期间写一篇论文。 我创建了一个使用罗斯的parametrized model 的相当简单的模块化算法。 它可以完美地适用于任何长度的多项式和任何参数组合,除了一个;当输入数据的长度小于多项式的宽度时,选择一个初始值(“INIT”),该值设置了任何“超过”输入数据长度的位。

例子:

Input Data: 0x4C
Poly: 0x1021
Xorout: 0x0000
Refin: False
Refout: False

如果我不选择任何 INIT 或任何像 0x##00 这样的 INIT,我会得到与任何在线 CRC 生成器相同的校验和。如果设置了最后两个十六进制字符的任何位 - 例如 0x0001 - 我的结果无效。

我相信问题归结为“如果两个字节的 INIT 参数只有一个字节的输入数据,那么寄存器如何初始化?”

【问题讨论】:

    标签: vba crc


    【解决方案1】:

    原来我被误导了(或者我很可能误解了)sunshine2k 网站上关于如何使用 INIT 参数的解释。 INIT 值不能与前 n 个输入字节本身进行异或(n 是寄存器的宽度/裁剪后的多边形/校验和),而只能在在 n 个 0 位被附加到输入数据之后。 当输入数据等于或大于 n 个字节时,此规范无关紧要,但当输入数据太短时,它却很重要。

    【讨论】:

    • 我不确定问题出在哪里。 Ross 链接中的示例代码初始化 CRC,然后一次更新一个字节(不是一次n 位),这应该不是问题。计算 CRC 后,将其附加到输入数据(与 n 附加 0 位有效异或),通常最重要的字节在前。你没有发布失败的代码,所以我不能确定问题是什么。
    • 自从我在 Excel 中进行 VBA 实现以来,我已经构建了自己的代码。正因为如此,我的算法相当循序渐进。从我在 sunsung2k 网站上阅读的内容来看,我假设您必须简单地将初始化器 XOR 到输入数据中,然后沿着普通路径(附加 0 位,用输入数据填充寄存器,从那里计算 CRC)。由于输入数据太短,我不确定将初始化器异或到哪里。现在,当我在初始值中添加异或之前的 0 位时,它现在按预期工作 - 有足够的材料进行异或。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多