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 bei den Ausgaben ist bedingt 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 die Flate-Bibliothek von Golang, 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:
<code class="go">func compress(source string) []byte { buf := new(bytes.Buffer) w, _ := flate.NewWriter(buf, 7) w.Write([]byte(source)) w.Flush() return buf.Bytes() }</code>
Bytes vs. Complete Stream
Es ist wichtig zu beachten, dass die Ausgabe des Python-Beispiels ist kein kompletter Stream. Der Puffer wird erst geleert, nachdem die erste Zeichenfolge komprimiert wurde.
Einschränkungen der Byte-zu-Byte-Übereinstimmung
Vergleich der Byte-zu-Byte-Ausgabe verschiedener Komprimierungsbibliotheken mit Komprimierte Daten abzugleichen ist im Allgemeinen nicht möglich oder praktisch. Die von Komprimierungsbibliotheken erzeugte Ausgabe ist garantiert kompatibel und nicht identisch.
Das obige ist der detaillierte Inhalt vonWarum erzeugen Python und Golang Zlib unterschiedliche komprimierte Ausgaben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!