/ / golang / python zlibの違い - python、go、zlib

golang / python zlibの違い - python、go、zlib

Pythonのzlibとgolangのzlibの違いをデバッグする。なぜ次の結果が同じではないのですか?

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 5バイト目はgolangバージョンには 4 - 何が原因で出力が違うのですか?

回答:

回答№1は1

Pythonの例の出力は、 "完全な"ストリームではなく、最初の文字列を圧縮した後にバッファをフラッシュするだけです。Goコードから同じ出力を置き換える Close() 〜と 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からの出力を比較しています。これはDEFLATEを内部的に使用してzlib形式の出力を生成します。 flate ゴーでは、 DEFLATE実装。 生の完全なDEFLATEストリームを出力するためにpython zlibライブラリを入手できるかどうかは分かりませんが、圧縮されたデータのバイト毎の一致を出力するために別のライブラリを入手しようとすると、有用で保守的に見えません。圧縮ライブラリの出力は、互換性があり、同一ではないことが保証されています。