Crypto ++将Adler32摘要(字节数组)转换为uint32_t

时间:2011-11-16 20:20:54

标签: crypto++ adler32 uint32-t

我遇到以下问题:我正在尝试使用Crypto++计算数据块的adler32校验和,但在将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
希望有人能给我一个提示。

greetz Fabian

2 个答案:

答案 0 :(得分: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主机格式。

答案 1 :(得分:0)

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