golang/python zlib的区别 [英] golang/python zlib difference

查看:68
本文介绍了golang/python zlib的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

调试Python的zlib和golang的zlib之间的差异.为什么以下结果没有相同的结果?

Debugging differences between Python's zlib and golang's zlib. Why don't the following have the same results?

compress.go :

package main

import (
    "compress/flate"
    "bytes"
    "fmt"
)


func compress(source string) []byte {
    w, _ := flate.NewWriter(nil, 7)
    buf := new(bytes.Buffer)

    w.Reset(buf)
    w.Write([]byte(source))
    w.Close()

    return buf.Bytes()
}


func main() {
    example := "foo"
    compressed := compress(example)
    fmt.Println(compressed)
}

compress.py :

from __future__ import print_function

import zlib


def compress(source):
    # golang zlib strips header + checksum
    compressor = zlib.compressobj(7, zlib.DEFLATED, -15)
    compressor.compress(source)
    # python zlib defaults to Z_FLUSH, but 
    # https://golang.org/pkg/compress/flate/#Writer.Flush
    # says "Flush is equivalent to Z_SYNC_FLUSH"
    return compressor.flush(zlib.Z_SYNC_FLUSH)


def main():
    example = u"foo"
    compressed = compress(example)
    print(list(bytearray(compressed)))


if __name__ == "__main__":
    main()

结果

$ go version
go version go1.7.3 darwin/amd64
$ go build compress.go
$ ./compress
[74 203 207 7 4 0 0 255 255]
$ python --version
$ python 2.7.12
$ python compress.py
[74, 203, 207, 7, 0, 0, 0, 255, 255]

Python版本的第五个字节为 0 ,但是golang版本的为 4 -是什么导致了不同的输出?

The Python version has 0 for the fifth byte, but the golang version has 4 -- what's causing the different output?

推荐答案

python示例的输出不是完整"流,它只是在压缩第一个字符串后刷新缓冲区.通过将 Close()替换为 Flush():

The output from the python example isn't a "complete" stream, its just flushing the buffer after compressing the first string. You can get the same output from the Go code by replacing Close() with Flush():

https://play.golang.org/p/BMcjTln-ej

func compress(source string) []byte {
    buf := new(bytes.Buffer)
    w, _ := flate.NewWriter(buf, 7)
    w.Write([]byte(source))
    w.Flush()

    return buf.Bytes()
}

但是,您正在比较python中zlib的输出,python内部使用DEFLATE生成zlib格式的输出,而Go中的 flate 则是DEFLATE的实现.我不知道是否可以获取python zlib库来输出原始的完整DEFLATE流,但是尝试获取不同的库来输出压缩数据的逐字节匹配似乎并不有用或无法维护.压缩库的输出仅保证是兼容的,而不是完全相同的.

However, you are comparing output from zlib in python, which uses DEFLATE internally to produce a zlib format output, and flate in Go, which is a DEFLATE implementation. I don't know if you can get the python zlib library to output the raw, complete DEFLATE stream, but trying to get different libraries to output byte-for-byte matches of compressed data doesn't seem useful or maintainable. The output of the compression libraries is only guaranteed to be compatible, not identical.

这篇关于golang/python zlib的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆