【问题标题】:C++ checksum CRC32 validationC++ 校验和 CRC32 验证
【发布时间】:2019-05-14 14:06:09
【问题描述】:

我正在使用 7zip CHA32 工具来验证我的校验和 32 算法。当且仅当数据缓冲区的大小是 4 的倍数时,该算法才会给出正确的值。如果缓冲区的大小不同,如果我在缓冲区中填充一个额外的“00”字节,该算法会给出正确的校验和。是否有任何通用 C++ 算法可以在没有数据大小限制的情况下工作?谢谢

【问题讨论】:

  • 添加额外填充是否有任何问题(对于 CRC32 算法,通常最多 3 个字节)。使用余数运算符确定填充字节的数量。
  • 我有一个额外的 3 个字节的模数(大小是恒定的),我填充了一个额外的字节。当我尝试使用 7Zip CHA 32 验证计算的校验和时出现问题,我得到不同的值,有和没有填充字节。
  • 为了与我的验证程序保持一致,我正在尝试使用 7zip CHA 32 算法调整我的算法!
  • 您可能想要使用不同的工具来验证您的 CRC32 实现。查看 NIST 网站,请参阅 NIST CRC32nist.gov
  • 什么是 7zip cha32? Google 不提供任何相关结果。它与CRC32有什么关系? CRC 算法本身不需要填充。

标签: c++ 7zip crc32


【解决方案1】:

CRC-32 不需要您填充输入。例如crc32("abc")crc32("abc\0") 会有不同的输出。

应该有第二个函数或参数默认为 0 作为哈希的初始值。这用于扩展哈希。 crc32("cd", crc32("ab")) == crc32("abcd")。所以只需添加最后几个字节。

你会得到这样的结果:

std::uint32_t padded_crc32(const char* data, std::size_t size, std::uint32_t initial_value = 0) {
    const char padding[3] = {0, 0, 0};
    std::uint32_t unpadded_crc32 = crc32(data, size, initial_value);  // Or however you call it
    int padding_size = (4 - (size % 4)) % 4;
    return crc32(padding, padding_size, unpadded_crc32);
}

【讨论】:

猜你喜欢
  • 2011-02-04
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 2017-08-20
  • 2020-08-11
  • 1970-01-01
相关资源
最近更新 更多