„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum erzeugen Python und Golang Zlib unterschiedliche komprimierte Ausgaben?

Warum erzeugen Python und Golang Zlib unterschiedliche komprimierte Ausgaben?

Veröffentlicht am 08.11.2024
Durchsuche:831

Why Do Python and Golang Zlib Produce Different Compressed Outputs?

Den Unterschied zwischen Golang- und Python-Zlib-Ausgaben verstehen

Beim Komprimieren einer Zeichenfolge mithilfe der Zlib-Komprimierung erzeugt die Zlib-Bibliothek von Python eine andere Ausgabe als Golangs zlib-Implementierung. Insbesondere unterscheidet sich das fünfte Byte, wobei Python einen Wert von 0 hat, während Golang einen Wert von 4 hat.

Ursache des Unterschieds

Die Ungleichheit in den Ausgaben ergibt sich aus den verschiedenen Löschmechanismen, die von den Python- und Go-Bibliotheken verwendet werden. Pythons zlib ist standardmäßig auf Z_FLUSH eingestellt, wodurch der Puffer nach der Komprimierung jedes Datenblocks geleert wird. Im Gegensatz dazu verwendet Golangs Flate-Bibliothek, die Zlib implementiert, standardmäßig Z_SYNC_FLUSH. Dieses Verhalten löscht die Daten, nachdem der gesamte Eingabestream verarbeitet wurde.

So erhalten Sie die gleiche Ausgabe in Golang

Um die gleiche Ausgabe wie Pythons zlib zu erhalten, ersetzen Sie Close() mit Flush() im Go-Code:

func compress(source string) []byte {
    buf := new(bytes.Buffer)
    w, _ := flate.NewWriter(buf, 7)
    w.Write([]byte(source))
    w.Flush()

    return buf.Bytes()
}

Bytes vs. vollständiger Stream

Es ist wichtig zu beachten, dass die Ausgabe des Python-Beispiels kein vollständiger Stream ist. Der Puffer wird erst geleert, nachdem die erste Zeichenfolge komprimiert wurde.

Einschränkungen des Byte-zu-Byte-Abgleichs

Vergleich der Byte-zu-Byte-Ausgabe verschiedener Komprimierungsbibliotheken mit Komprimierte Daten abzugleichen ist im Allgemeinen nicht möglich oder praktikabel. Die von Komprimierungsbibliotheken erzeugte Ausgabe ist garantiert kompatibel und nicht identisch.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3