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

問題は、このコードがあなたが望むことをしないということです:

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 に答える
0

さて、crypto++ の adler32 実装が s1 = 1; を初期化することがわかりました。adler32.h http://www.cryptopp.com/docs/ref/adler32_8h_source.htmlの s2 = 0 ですが、 s1 = 0 および s2 = 0 である必要があります。実装は「間違っています」。グリーツ・ファビアン

于 2011-11-17T16:38:24.220 に答える