首页  >  文章  >  后端开发  >  为什么 Golang 的“flate”产生与 Python 的“zlib”不同的压缩输出?

为什么 Golang 的“flate”产生与 Python 的“zlib”不同的压缩输出?

DDD
DDD原创
2024-10-30 19:43:02134浏览

Why Does Golang's `flate` Produce Different Compression Output Than Python's `zlib`?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn