了解 Golang 和 Python Zlib 输出的差异
使用 Zlib 压缩来压缩字符串时,Python 的 zlib 库会产生与Golang 的 zlib 实现。具体来说,第五个字节不同,Python 的值为 0,而 Golang 的值为 4。
差异的原因
输出的差异源于来自 Python 和 Go 库使用的不同刷新机制。 Python的zlib默认为Z_FLUSH,它在压缩每个数据块后刷新缓冲区。相比之下,Golang 的 flate 库实现了 Zlib,默认使用 Z_SYNC_FLUSH。此行为会在处理整个输入流后刷新数据。
如何在 Golang 中获得相同的输出
要获得与 Python 的 zlib 相同的输出,请替换Go 代码中的 Close() 和 Flush():
<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
需要注意的是,Python 示例的输出是不是一个完整的流。它仅在压缩第一个字符串后刷新缓冲区。
字节到字节匹配的限制
将不同压缩库的字节到字节输出与匹配压缩数据一般是不可行或不实用的。压缩库产生的输出保证是兼容的,而不是相同的。
以上是为什么 Python 和 Golang Zlib 产生不同的压缩输出?的详细内容。更多信息请关注PHP中文网其他相关文章!