2010-03-27 18 views
1

Je dois lire un fichier PNG et interpréter toutes les informations qui y sont stockées et l'imprimer en format lisible par l'utilisateur. En travaillant sur le format PNG, j'ai compris qu'il utilise CRC-32 pour générer une somme de contrôle pour chaque segment. Mais je ne pouvais pas comprendre les informations suivantes mentionnées sur le site de spécification de fichier PNG: Le polynôme utilisé par PNG est: x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1CRC pour le format de fichier PNG

Voici le lien pour la référence: http://www.w3.org/TR/PNG/

quelqu'un peut-il me s'il vous plaît aider à comprendre cela?

Cordialement, Darkie

+0

[http://math.stackexchange.com/](http://math.stackexchange.com/) – Grokodile

Répondre

6

S'il vous plaît ne pas implémenter votre propre quand vous pouvez utiliser cette bibliothèque à la place.


[EDIT]: Comment utiliser la calculatrice CRC de zlib (un exemple en C extrait de la documentation zlib).

#include <zlib.h> 

uLong crc = crc32(0L, Z_NULL, 0); 

while (read_buffer(buffer, length) != EOF) { 
    crc = crc32(crc, buffer, length); 
} 
if (crc != original_crc) error(); 

Si vous avez le bloc de données pour lequel vous voulez obtenir le CRC, vous n'avez pas besoin de cela en boucle; vous venez d'obtenir la valeur initiale (première affectation à crc ci-dessus), puis de calculer la valeur sur les données que vous avez (deuxième affectation à crc).

+0

Bonjour Donald, Je dois vérifier si la somme de contrôle correspond à chaque segment avec ma propre valeur de total de contrôle calculée. Quelle devrait être la procédure dans ce cas? –

4

http://en.wikipedia.org/wiki/Computation_of_CRC? Selon la liste des CRC du wiki, ce polynôme (aussi appelé polynôme AUTODIN II) est l'un des plus utilisés. CRC-32 IEEE 802.3 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x7 + x8 + x4 + x5 + x2 + x + 1

d'occasion (Ethernet, V.42, MPEG -2, PNG, cksum Posix, ARJ, Lha32, Rar, Zip, et plus ..)

Rewritted avec une puissance marquée par ^:

x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1. 

vous pouvez donc lire source de cksum, par exemple ici

http://www.opensource.apple.com/source/file_cmds/file_cmds-188/cksum/crc32.c

Le sur le registre à décalage suivant AUTODIN-II 32 bits CRC est construit modèle de référence.

polynôme: g (x) = 1 + x + x^4 + x^5 + x^7 + x^8 + x^10 + x^11 + x^12 + x^1 + x^22 + x^23 + x^26 + x^32

données bit d'entrée 0 premier

Leading-zero checking is performed by the following procedure: 

1. The crc register is initialized to 0xffffffff, not zero. 

2. When a crc is appended, the 32 bits of the crc are inverted. 

3. When checking a good message with an appended crc, the register 
    will return to the fixed value of 0xdebb20e3, rather than zero. 
0

Avez-vous lu des articles sur wikipedia CRCs? Il n'y a pas de format CRC unifié, chaque 'format' est construit sur un polynôme comme celui-ci.

Je ne suis pas très familier avec le calcul des CRC à la main non plus, mais ce que vous regardez est en fait le format qui est utilisé dans POSIX. Je suis sûr qu'il y a des tonnes d'implémentations utiles. C'est l'algorithme CRC-32 implémenté dans zlib.