1

我有以下问题:我正在尝试使用 计算数据块的 adler32 校验和Crypto++,但在将 byte[4] 数组输出转换为 uint32_t 后得到错误的校验和。

这个带有 crc32 的函数可以正常工作:

CryptoPP::CRC32 crc;
byte digest[CryptoPP::CRC32::DIGESTSIZE];
crc.CalculateDigest(digest, (const byte*)pData.data(), pData.size());
uint32_t checksum = *(uint32_t*)digest; //this works fine

但计算 adler32 的函数返回无效值:

CryptoPP::Adler32 adler;
byte digest[CryptoPP::Adler32::DIGESTSIZE];
adler.CalculateDigest(digest, (const byte*)pData.data(), pData.size());
uint32_t checksum = *(uint32_t*)digest; //this returns a invalid value

希望有人能给我一个提示。

问候费边

4

2 回答 2

0

好吧,我发现crypto++的adler32实现初始化s1 = 1;adler32.h http://www.cryptopp.com/docs/ref/adler32_8h_source.html中的 s2 = 0但它应该是 s1 = 0 和 s2 = 0。现在我所有的校验和都是正确的,但我仍然不明白为什么 cryto++实施是“错误的”。问候费边

于 2011-11-17T16:38:24.220 回答
0

问题是这段代码没有做你想做的事:

uint32_t checksum = *(uint32_t*)digest; //this returns a invalid value

此代码表示读取摘要,就好像它以该 CPU 本地存储 32 位整数的形式保存一个 32 位整数一样。但它不包含那个。它包含一个表示散列的 4 字节数组,但不是 x86-CPU 样式的整数。

尝试这个:

uint32_t checksum = ntohl(*(uint32_t*)digest);

这表示将原始字节读取为整数,然后将它们转换为 X86 主机格式。

于 2011-11-16T20:24:36.917 回答