c++ - C++ 校验和 CRC32 验证
问题描述
我正在使用 7zip CHA32 工具来验证我的校验和 32 算法。当且仅当数据缓冲区的大小是 4 的倍数时,该算法才会给出正确的值。如果缓冲区的大小不同,如果我在缓冲区中填充一个额外的“00”字节,该算法会给出正确的校验和。是否有任何通用 C++ 算法可以在没有数据大小限制的情况下工作?谢谢
解决方案
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);
}
推荐阅读
- javascript - 如何使用 JavaScript 和 Html 创建不可编辑的网站
- google-colaboratory - 通过 Colab 将 Google Drive 集成到 Google Cloud 存储
- typescript - 如何使用类验证器装饰器比较 graphql 类型的输入类型中的字段
- python - shell stdout PYTHON 处理比 PYTHON txt 文件处理慢得多
- ios - 在轴图 ios 上同时使用字符串和日期
- excel - VBA 使用 COUNTIFS 作为公式
- python - 退出代码 -1 的含义
- python - 如何使用 pathlib.Path().glob() 读取文件并将具有相同文件名的文件输出到另一个子文件夹
- .net-core - 如何从现有数据库创建迁移
- python - 无法在 python 中加载 csv 文件