当前位置: 首页 > 知识库问答 >
问题:

C++boost组合crc校验和

常光明
2023-03-14

为了避免多次重新计算一个项目的数据,我希望对这些项目使用已经计算好的crc。或以伪代码:

crc = process_data(data);

for (auto item : items)
    crc = combine_magic(crc, item.crc());

问题是combine_magic应该是什么。我使用boost crc库,但我没有在那里找到这样的功能。简单地使用xor是一个坏主意,因为我可能会完成一些指向偶数次的项--这将从等式中消除它们。Zlib似乎提供了这样的函数https://github.com/madler/Zlib/blob/master/crc32.c,但是我想避免增加一个依赖项。

共有1个答案

马博学
2023-03-14

如果您不想使用zlib,那么只需从zlib复制代码:crc32_combine_()gf2_matrix_square()gf2_matrix_times()。大约有60行代码。

您的combine_magic()函数还需要用于计算CRC的项中的字节数,以便将其与CRC组合。因此,与CRC一起节省该长度。

顺便说一句,boost无论如何都需要zlib。

 类似资料:
  • plz请参阅本页以查看Boost::CRC示例代码:http://www.boost.org/doc/libs/1_37_0/libs/crc/crc_example.cpp

  • 我最近想使用CRC-32校验和进行文件完整性检查,并试图以同样的方式验证它,但似乎这种“对比零技巧”在这里是不可能的?! 例如,如果我在CRC在线计算器上使用32位值0xdeadbeef: https://www.lammertbies.nl/comm/info/crc-calculation.html 谁能解释一下,为什么这个“零比零技巧”对CRC-32不起作用?

  • 我有两个来源来计算看似相同的crc值。我不明白为什么'boost/crc.hpp'实现与'linux/lib/crc-ccitt.c'实现不同。 CRC-CCITT.C boost 这里有一个例子说明了这个问题。因为我的电脑上没有Linux内核源码,所以这是一个很长的时间。如果将boost链接到它,它就会编译。 null 我的机器上的输出是:

  • 开始感觉很好...但之后就被难住了。无法确定CRC-16多项式。很有可能这些数据包散列不是与CRC相关的,而是某种家庭酝酿的方案。 阅读Ross N.Williams的“CRC错误检测算法的无痛指南” 不幸的是,我无法访问任何设备的源代码/二进制代码 > 在数据包的最后2个字节上找到CRC。 如果我查看逻辑分析器上的位,我已经将字节表示为MSB-First 因此,数据包0x47366B2EE000

  • 问题内容: 我有这个字节数组: 现在,假定此字节数组的CRC校验和为0x60、0x0A。我希望Java代码重新创建此校验和,但是我似乎无法重新创建它。我尝试了crc16: 并使用Integer.toHexString()进行转换,但结果均不匹配正确的CRC。有人可以根据CRC公式指出我正确的方向。 问题答案: 请使用以下代码: 但是,您可能必须反转返回的CRC才能获得正确的字节序。我什至在这里测试

  • 我有一个通过RS232 COM与计算机通信的终端。我得到的协议说,我必须发送一定的字节组合和CRC 16 IBM计算的数据在最后发送 我还得到了一个C编写的应用程序,我可以用它来测试,该应用程序编写了一个带有发送数据和接收数据的日志。在该日志中,我查看是否向终端发送了以下字符串。我还必须发送数据06 35的这个CRC16 IBM结果。 我已经设法以某种方式将作为示例给出的C方法翻译成C#。但我的结