我遇到了以下问题:我试图使用Crypto++计算数据块的adler32校验和,但在将byte4数组输出转换为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希望有人能给我一点提示。
问候法比安
发布于 2011-11-17 04:24:37
问题是这段代码并没有做你想要的事情:
uint32_t checksum = *(uint32_t*)digest; //this returns a invalid value这段代码告诉我们,在读取摘要时,就好像它持有一个32位整数,该CPU本机存储32位整数的形式。但它并不包含这些。它包含一个4字节的数组,表示散列,但不是x86-CPU样式的整数。
试试这个:
uint32_t checksum = ntohl(*(uint32_t*)digest);这意味着要将原始字节读取为整数,然后将它们转换为X86主机格式。
发布于 2011-11-18 00:38:24
嗯,我发现加密++的adler32实现初始化s1 = 1;s2 = 0在adler32.h http://www.cryptopp.com/docs/ref/adler32_8h_source.html,但它应该是s1 =0和s2 =0。现在我所有的校验和都是正确的,但我仍然不明白为什么加密++的实现是“错误的”。
https://stackoverflow.com/questions/8158128
复制相似问题