2011-11-16 38 views
1

我有以下問題:我試圖使用Crypto++來計算數據塊的adler32校驗和,但在轉換byte [4]數組輸出後得到錯誤的校驗和到uint32_t。Crypto ++將Adler32摘要(字節數組)轉換爲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 

希望有人可以給我一個提示。

的Fabian格爾茨

回答

0

的問題是,你想要的這個代碼沒有:

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主機格式。

+0

我收到以下編譯器錯誤:「未定義的引用到'ntohl @ 4'」使用mingw甚至強硬我包括winsock2.h。有沒有其他的方式來做到這一點,沒有額外的功能? – Fabian

+0

你可以這樣做:'checksum = digest [0];校驗<< = 8;校驗和| =消化[1];校驗<< = 8;校驗和| =消化[2];校驗<< = 8;校驗和| =摘要[3];' –

+0

它也違反了C/C++標準。 punning使用一個指向字節(應該是1)與int(應該是4)對齊的指針。該值需要'memmov''d或'memcpy''d出來。 – jww

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

+0

我認爲這是因爲校驗和計算爲'1 + d_1 + d_2 + ... + d_n'。如果您將初始值省略爲1,則不會遵循Adler32算法。 – jww