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

CRC校验和对零的验证

龚国源
2023-03-14

我最近想使用CRC-32校验和进行文件完整性检查,并试图以同样的方式验证它,但似乎这种“对比零技巧”在这里是不可能的?!

例如,如果我在CRC在线计算器上使用32位值0xdeadbeef:

  • https://www.lammertbies.nl/comm/info/crc-calculation.html

谁能解释一下,为什么这个“零比零技巧”对CRC-32不起作用?

共有1个答案

颜楚青
2023-03-14

问题不是CRC是32位,而是CRC是后补的,xorout=0xFFFFFFF。如果将CRC(little endian)追加到消息中,然后再次计算CRC,如果没有错误,CRC将始终为0x2144DF1C。因此,在本例中,您将根据0x2144DF1C验证CRC。

您可能会发现这个在线CRC计算器的信息量更大,因为它显示了参数:多项式、xorin、Xorout。

http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

CRC32X{0x31 0x32 0x33 0x34} = 0xBAA73FBF
CRC32X{0x31 0x32 0x33 0x34 0xBF 0x3F 0xA7 0xBA} = 0x00000000
CRC32X{0x00 0x00 0x00 0x00} = 0x00000000
CRC32X{0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00} = 0x00000000

然后看看补充《儿童权利公约》和附加《儿童权利公约》的效果:

CRC32X{0x00 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF} = 0xDEBB20E3

取补语(用~表示not):

~CRC32X{0x00 0x00 0x00 0x00 0xFF 0xFF 0xFF 0xFF} = ~0xDEBB20E3 = 0x2144DF1C

初始值与消息的前4个字节进行异或。因此,对于初始值为0xFFFFFFFF的CRC32(),以及后补CRC:

 CRC32(0x00 0x00 0x00 0x00) = 0x2144DF1C 
~CRC32X(0xFF 0xFF 0xFF 0xFF) = ~0xDEBB20E3 = 0x2144DF1C
 类似资料:
  • 为了避免多次重新计算一个项目的数据,我希望对这些项目使用已经计算好的crc。或以伪代码: 问题是combine_magic应该是什么。我使用boost crc库,但我没有在那里找到这样的功能。简单地使用xor是一个坏主意,因为我可能会完成一些指向偶数次的项--这将从等式中消除它们。Zlib似乎提供了这样的函数https://github.com/madler/Zlib/blob/master/cr

  • 因为我每次都希望得到完全相同的数据包,所以当数据包有效时,我希望CRC校验和为零,而当存在传输错误时,我希望CRC校验和不为零。 我知道当发送数据包时,我可以将计算出的CRC16添加到数据包的末尾,并且在接收端,CRC校验将输出0,但是在这种情况下,不可能将CRC16校验和添加到数据包,因为数据包是由SPI线上的多个发送方芯片构造的,每个芯片只填充整个数据包中自己的两个字节。 我需要在接收端加载一

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

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

  • 问题内容: 是否可以选择表中的整行并获得某种校验和?我正在寻找一种方法,告诉我的代码仅在更改了至少一条记录后才更新数据。从数据更改跟踪的角度来看,这将有助于我减少历史记录表中记录的许多更改。- 谢谢。 问题答案: 您可以结合使用和函数来为该行生成MD5校验和: 如果其中一列是可为空的,请确保将其包装在中,因为null会使结果也为null。 另请注意,这不是100%安全的。如果从一列中删除1个字符并

  • 我正试图为一个P1 meter消息的CRC16校验和编写一个单元测试(而且很难把它弄对...)。 我所拥有的是: null 来源可以在这里找到 CRC是对数据消息中的前面字符计算的CRC16值(从“/”到“!”,使用多项式:x16+x15+x2+1)。 CRC16不使用异或输入,不使用异或输出,并以最低有效位优先计算。该值表示为4个十六进制字符(MSB优先)。 @马克·阿德勒,我修复了你发现的问题