英文:
zlib difference between golang and python
问题
Go语言和Python语言在使用zlib压缩算法时的结果存在差异。具体来说,Go语言使用zlib.NewWriterLevel函数创建压缩器时,默认的压缩级别为zlib.DefaultCompression,而Python语言使用zlib.compress函数时,默认的压缩级别为-1(即使用默认压缩级别)。这导致了两者在压缩同一数据时得到的结果不同。
要在Go语言中获得与Python相同的结果,可以使用zlib.NewWriter函数创建压缩器,并将压缩级别设置为-1。修改后的Go代码如下:
package main
import (
"bytes"
"encoding/hex"
"compress/zlib"
"fmt"
)
func zlibCompress(src []byte) []byte {
var in bytes.Buffer
w := zlib.NewWriter(&in)
w.Write(src)
w.Close()
return in.Bytes()
}
func main() {
fmt.Println(hex.EncodeToString(zlibCompress([]byte{'1'})))
}
这样修改后,Go语言的输出结果将与Python的输出结果一致。
英文:
Go:
package main
import (
"bytes"
"encoding/hex"
"compress/zlib"
)
func zlibCompress(src []byte) []byte {
var in bytes.Buffer
w, _ := zlib.NewWriterLevel(&in, zlib.DefaultCompression)
w.Write(src)
w.Close()
return in.Bytes()
}
func main(){
fmt.Println(hex.EncodeToString(zlibCompress([]byte{'1'})))
}
Output:
789c3204040000ffff00320032
Python:
compressed_data = zlib.compress(b"1")
print(compressed_data.hex())
Output:
789c33040000320032
What is the defference bettween "3204040000ffff" and "330400" ?
I googled "zlib 0000ffff" and found that "0000ffff" is the flag of flush.
because I can not modify the server-side, so I must make my go project fit the server-side. I tried pass the data compresed by golang to the server-side,but the server refuse it because it can't decompress the data.
How to get python-style result in golang?
答案1
得分: 1
是的,Golang添加了一个空的存储块。不过,这对你来说并不重要。两者都会解压缩成相同的内容,所以不用担心结果不同。两个输出都是有效的。
第一个输出:
! infgen 3.0 输出
!
zlib
!
fixed
literal '1
end
!
last
stored
end
!
adler
第二个输出:
! infgen 3.0 输出
!
zlib
!
last
fixed
literal '1
end
!
adler
Golang将存储块作为最后一个块添加到结束的压缩流中,而Python考虑到这是所有的数据,所以将第一个块作为最后一个块。
英文:
Yes, an empty stored block was added by Golang. No, this doesn't matter for you. Both will decompress to the same thing. Do not worry about getting the same result. Both outputs are valid.
The first one:
! infgen 3.0 output
!
zlib
!
fixed
literal '1
end
!
last
stored
end
!
adler
and the second:
! infgen 3.0 output
!
zlib
!
last
fixed
literal '1
end
!
adler
Golang is adding the stored block as a last block to end the deflate stream, whereas Python took into account that that was all of the data, so it made the first block the last block.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论