为什么golang编码/格式不同于python zlib.compress?

问题描述 投票:0回答:1

我正在更改python源代码,在2种语言之间的压缩库中有问题。最高压缩级别已使用如下:

import zlib
import base64

s = "abc"
enc = zlib.compress(s.encode("utf-8"), 9)
print(list(enc))
print(base64.b64encode(enc)) # b'eNpLTEoGAAJNASc='

执行代码

import (
  "log"
  "bytes"
  "compress/flate"
  "encoding/hex"
  "encoding/base64"
)

func main() {
  s := "abc"


  var b bytes.Buffer
  w, _ := flate.NewWriter(&b, flate.BestCompression)
  w.Write([]byte(s))
  w.Flush()
  w.Close()


  bb := b.Bytes()

  log.Println(base64.StdEncoding.EncodeToString(bb)) // SkxKBgAAAP//AQAA//8=
  log.Println(hex.Dump(bb))
}
  1. pythonzlib.compressofficial document没有提到zlib.compress算法。我还在堆栈溢出中搜索了其他问题(1),但是我尝试了解决方案,但对我来说不起作用。哪种算法zlib.compress用于压缩数据?

  2. 为什么输出从go compress/flate到python zlib.compress不同。如果在此比较中使用错误的算法,您能否让我知道正确的算法?

python go zlib
1个回答
0
投票

我从Go's github找到了答案。输出可以不同,但​​是遵循RFC 1950。因此,我可以按以下步骤逆转上述步骤:

output_from_go = "SkxKBgAAAP//AQAA//8="
encoded  = base64.b64decode(output_from_go)
rr = zlib.decompress(encoded, -15)
print(rr) # b'abc'
© www.soinside.com 2019 - 2024. All rights reserved.