我正在更改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))
}
pythonzlib.compress
official document没有提到zlib.compress
算法。我还在堆栈溢出中搜索了其他问题(1),但是我尝试了解决方案,但对我来说不起作用。哪种算法zlib.compress
用于压缩数据?
为什么输出从go compress/flate
到python zlib.compress
不同。如果在此比较中使用错误的算法,您能否让我知道正确的算法?
我从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'