Ich bin gerade dabei, eine kleine PNG-Bild-I/O-Bibliothek selbst zu Lernzwecken zu schreiben. Mein Problem ist folgendes:Versuchen, zlib/deflate in PNG-Dateien zu verstehen
Ich erstellte ein kleines PNG nur 2 mal 2 Pixel in der Dimension und öffnete es in einem Hex-Editor, um seinen Inhalt zu studieren. Dies ist das Bild, das ich mit GIMP erstellt und mit einer Komprimierung von "9" gespeichert habe.
(Bitte beachten Sie, dass dies ein vergrößertes Bild des Original 2 von 2 Pixelbild ist;))
So unkomprimiert Ich denke, dies so etwas wie dies in Erinnerung aussehen würde:
00 00 00 FF 00 00 00 00 FF 00 FF 00
wenn ohne Alphakanal gespeichert wird.
(Ich habe dies hier nur zur Verdeutlichung angegeben. Ich kenne die Komprimierung und habe nicht erwartet, dieses Byte-Muster in der Datei zu sehen).
I extrahiert, um das IDAT Chunk und gestrippt, um das ID chunk ("IDAT") und der rückstand CRC-Wert und erhielt diese Folge von Bytes:
08 D7 05 C1 01 01 00 00 00 80 10 FF 4F 17 10 48 06 0F FE 02 FE
Nun sind die ersten beiden Bytes 08 D7
Informationen über den kodierten Block enthalten . Und die letzten vier Bytes 0F FE 02 FE
müssen die ADLER32 Prüfsumme sein.
mich Dies lässt schließlich mit den folgenden Bytes:
05 C1 01 01 00 00 00 80 10 FF 4F 17 10 48 06
in Binärdarstellung Geschrieben diese Bytes sind:
0000 0101 1100 0001 0000 0001 0000 0001
0000 0000 0000 0000 0000 0000 1000 0000
0001 0000 1111 1111 0100 1111 0001 0111
0001 0000 0100 1000 0000 0110
Um zu verstehen, DEFLATE besser habe ich versucht, diese Sequenz von Hand zu "entpacken" auf zumindest bevor ich es gut genug verstehe, um ein kleines Werkzeug zu schreiben. Aber ich bin wirklich schnell steckengeblieben.
RFC 1951 ("DEFLATE Compressed Data Format Specification") besagt, dass jeder codierte Block mit einem Drei-Bit-Header beginnt. Ein Bit zeigt an, ob dies der letzte Block ist oder nicht und zwei weitere Blöcke zeigen die Komprimierungsmethode an. Da ich davon ausgehe, dass der Encoder hier nur einen Block verwendet (dh der erste Block ist automatisch der letzte) und einen nicht statischen Huffmann-Baum verwendet, suche ich nach der Bitfolge "101", kann sie aber nicht finden Header "100" oder "110").
Auch der RFC besagt, dass es zwei zwei Byte-Werte LEN und NLEN geben muss, die die Länge des Blocks speichern, wo NLEN das Einerkomplement von LEN ist, aber ich bin nicht in der Lage, vier solche Bytes zu finden, die diese Bedingung erfüllen. Ich werde nicht einmal von meinem Glück anfangen, etwas zu finden, das die beiden Huffmann-Bäume repräsentieren könnte.
las ich RFCs 1951 und 1950 ("ZLIB Compressed Data Format Specification" sowie den Wikipedia-Artikel auf zlib, DEFLATE, LZ77 und Huffman-Kodierung sowie mehrere kleine und wenig hilfreich Artikel im Internet und ein paar Antworten auf Stack-Überlauf, aber keine helfen könnte mich mit meinem Unverständnis.
ich würde für jede Hilfe oder Hinweis wirklich dankbar!
Vielen Dank für Ihre Antwort. Du hast recht, ich habe nicht an das Bit gedacht, das in Bytes angeordnet ist. Ich kenne die Filter und habe nur dieses kleine Beispiel eingefügt, um zu zeigen, was ich am Ende erwarte, nachdem ich die Filter dekomprimiert und entfernt habe ;-) ... hätte diesen Ausschnitt auch rauslassen können. –
Jetzt haben wir die Überschrift. Habe ich recht, dass die folgenden Nullen die Darstellung des ersten Huffmannbaumes sind? (BTW, Ja, es ist ein sehr niedriges Level und ich mache das sicherlich nicht wieder bei einem anderen Bildformat, aber ich möchte verstehen, was auf dieser Ebene mindestens einmal passiert ist ;-)). –
Wenn Sie eine detaillierte Erklärung wünschen, empfehle ich http://www.amazon.com/Compressed-Image-File-Formats-JPEG/dp/0201604434/ref=pd_sim_b_1?ie=UTF8&refRID=05VHZ02D8BR9MJCQNK3W – user3344003