首页  >  文章  >  后端开发  >  为什么 Python 和 Golang Zlib 产生不同的压缩输出?

为什么 Python 和 Golang Zlib 产生不同的压缩输出?

Susan Sarandon
Susan Sarandon原创
2024-10-28 18:31:29739浏览

Why Do Python and Golang Zlib Produce Different Compressed Outputs?

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

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