2011-11-16 3 views
1

J'ai le problème suivant: J'essaie de calculer la somme de contrôle adler32 d'un bloc de données en utilisant Crypto++, mais je reçois la mauvaise somme de contrôle après la conversion de la sortie de tableau byte [4] à un uint32_t.Crypto ++ convertir Adler32 digest (array byte) en uint32_t

Cette fonction avec crc32 fonctionne très bien:

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 

mais la fonction du calcul de la adler32 retourne une valeur non valide:

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 

quelqu'un d'espoir pourrait me donner un indice.

greetz Fabian

Répondre

0

Le problème est que ce code ne fait pas ce que vous voulez:

uint32_t checksum = *(uint32_t*)digest; //this returns a invalid value 

Ce code dit de lire le digest comme si elle détenait un entier de 32 bits sous la forme ce processeur stocke nativement des entiers de 32 bits. Mais ça ne le contient pas. Il contient un tableau de 4 octets représentant le hachage, mais pas un entier de style x86.

Essayez ceci:

uint32_t checksum = ntohl(*(uint32_t*)digest); 

Cela dit lire les octets brutes en un entier, puis les convertir en format X86 hôte.

+0

Je reçois l'erreur de compilation suivante: "référence non définie à' ntohl @ 4 '"en utilisant mingw même difficile j'ai inclus winsock2.h. existe-t-il un autre moyen de le faire sans une fonction supplémentaire? – Fabian

+0

Vous pouvez faire quelque chose comme ceci: 'checksum = digest [0]; somme de contrôle << = 8; somme de contrôle | = digérer [1]; somme de contrôle << = 8; somme de contrôle | = digérer [2]; somme de contrôle << = 8; checksum | = digest [3]; ' –

+0

C'est également une violation de la norme C/C++. Le punning utilise un pointeur aligné pour les octets (qui devrait être 1) par rapport à un int (qui devrait être 4). La valeur doit être 'memmov''d ou' memcpy''d out. – jww

0

bien j'ai découvert que l'implémentation adler32 de crypto ++ initialisait s1 = 1; s2 = 0 dans l'adler32.h http://www.cryptopp.com/docs/ref/adler32_8h_source.html mais ça devrait être s1 = 0 et s2 = 0. maintenant toutes mes sommes de contrôle sont correctes mais je ne comprends toujours pas pourquoi l'implémentation de cryto ++ est "fausse". greetz Fabian

+0

Je crois que c'est parce que la somme de contrôle est calculée comme '1 + d_1 + d_2 + ... + d_n'. Si vous omettez l'initialisation à 1, vous ne suivez pas l'algorithme Adler32. – jww