了解 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():
func compress(source string) []byte {
buf := new(bytes.Buffer)
w, _ := flate.NewWriter(buf, 7)
w.Write([]byte(source))
w.Flush()
return buf.Bytes()
}
字节与完整流
需要注意的是,Python 示例的输出不是完整流。它仅在压缩第一个字符串后刷新缓冲区。
字节到字节匹配的限制
比较不同压缩库的字节到字节输出匹配压缩数据一般是不可行或不实用的。压缩库产生的输出保证是兼容的,而不是相同的。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3