Golang 的 zlib 和 Python 的 zlib 之间压缩输出的差异
为了解决 Python 的 zlib 和 Golang 的 flate 之间观察到的不同压缩结果的问题,需要注意的是,它们使用不同的底层实现。
在 Python 中,使用了 zlib,这是一个基于 DEFLATE 的库,以 zlib 格式输出数据。另一方面,Golang 采用了 flate,一种 DEFLATE 实现。
输出差异的原因
观察到的差异源于输出中的第五个字节:Python 的 zlib将其设置为 0,而 Golang 的 flate 将其设置为 4。出现这种差异是因为 Python 的 zlib 配置为在压缩第一个字符串后刷新缓冲区,从而有效地截断输出。
为了在 Golang 中复制 Python 的行为,开发人员可以在压缩器中将 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>
兼容性与相同输出
但是,重要的是要认识到即使在调整之后Golang 的函数与 Python 的匹配,不保证结果的逐字节匹配。确保了压缩库之间的兼容性,但可能无法实现相同的输出。
差异源于库实现的固有差异以及压缩过程中使用的特定参数。因此,不建议依赖不同库之间的字节对字节相等。
以上是为什么 Golang 的“flate”产生与 Python 的“zlib”不同的压缩输出?的详细内容。更多信息请关注PHP中文网其他相关文章!