C ++校验和CRC32验证

时间:2019-05-14 14:06:10

标签: c++ 7zip crc32

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

1 个答案:

答案 0 :(得分:0)

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);
}