首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Crypto++将Adler32摘要(字节数组)转换为uint32_t

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

Stack Overflow用户
提问于 2011-11-17 04:20:54
回答 2查看 870关注 0票数 1

我遇到了以下问题:我试图使用Crypto++计算数据块的adler32校验和,但在将byte4数组输出转换为uint32_t后得到错误的校验和。

crc32的这个函数运行得很好:

代码语言:javascript
复制
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的函数返回一个无效值:

代码语言:javascript
复制
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

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

问候法比安

EN

回答 2

Stack Overflow用户

发布于 2011-11-17 04:24:37

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

代码语言:javascript
复制
uint32_t checksum = *(uint32_t*)digest; //this returns a invalid value

这段代码告诉我们,在读取摘要时,就好像它持有一个32位整数,该CPU本机存储32位整数的形式。但它并不包含这些。它包含一个4字节的数组,表示散列,但不是x86-CPU样式的整数。

试试这个:

代码语言:javascript
复制
uint32_t checksum = ntohl(*(uint32_t*)digest);

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

票数 0
EN

Stack Overflow用户

发布于 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。现在我所有的校验和都是正确的,但我仍然不明白为什么加密++的实现是“错误的”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8158128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档