Wie wird PNG CRC genau berechnet?

8

In den letzten 4 Stunden habe ich den CRC-Algorithmus untersucht. Ich bin mir ziemlich sicher, dass ich schon den Dreh rausbekommen habe.

Ich versuche, einen PNG-Encoder zu schreiben, und ich möchte keine externen Bibliotheken für die CRC-Berechnung oder für die PNG-Codierung selbst verwenden.

Mein Programm konnte die gleichen CRCs erhalten wie die Beispiele in Tutorials. Wie auf Wikipedia :

Mit dem gleichen Polynom und der gleichen Nachricht wie im Beispiel konnte ich in beiden Fällen das gleiche Ergebnis erzielen. Ich konnte dies auch für einige andere Beispiele tun.

Allerdings kann ich die CRC von PNG-Dateien nicht richtig berechnen. Ich habe das getestet, indem ich eine leere, eine Pixel große PNG-Datei in Farbe erstellt habe und sie als Vergleich dazu verwendet habe. Ich kopierte die Daten (und den Chunk-Namen) aus dem IDAT-Chunk des PNG (, aus dem der CRC berechnet wird ) und berechnet seine CRC mit dem in der png-Spezifikation angegebenen Polynom.

Das Polynom, das in der png-Spezifikation zur Verfügung gestellt wird, ist das Folgende:

%Vor%

Was sollte übersetzt werden:

%Vor%

Mit diesem Polynom versuchte ich, die CRC der folgenden Daten zu erhalten:

%Vor%

Das bekomme ich:

%Vor%

Das ist der eigentliche CRC:

%Vor%

Ich bin mir nicht ganz sicher, wie ich das beheben soll, aber ich denke, ich mache diesen Teil aus der Spezifikation falsch:

  

In PNG wird der 32-Bit-CRC für alle Einsen initialisiert, und dann werden die Daten von jedem Byte vom niedrigstwertigen Bit (1) zum höchstwertigen Bit (128) verarbeitet. Nachdem alle Datenbytes verarbeitet sind, wird der CRC invertiert (sein Einerkomplement wird genommen). Dieser Wert wird zuerst im MSB übertragen (im Datenstrom gespeichert). Zum Zweck der Trennung in Bytes und Reihenfolge wird das niedrigstwertige Bit des 32-Bit-CRC als der Koeffizient des x31-Terms definiert.

Ich bin mir nicht ganz sicher, ob ich das alles verstehen kann.

Auch hier ist der Code, den ich verwende, um den CRC zu erhalten:

%Vor%

Also, wie repariere ich das, um der PNG-Spezifikation zu entsprechen?

    
MythicManiac 06.06.2014, 12:52
quelle

1 Antwort

5

Sie können eine vollständige Implementierung der CRC-Berechnung (und der PNG-Codierung im Allgemeinen) in diesem Public-Domain-Code finden: Ссылка

%Vor%     
EricLaw 13.10.2014, 13:18
quelle

Tags und Links