当前位置: 首页 > 面试题库 >

golang / python zlib的区别

翟学文
2023-03-14
问题内容

调试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第五个字节,但golang版本具有4-是什么导致不同的输出?


问题答案:

python示例的输出不是“完整”流,它只是在压缩第一个字符串后刷新缓冲区。您可以通过替换Close()为从Go代码获得相同的输出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的输出,它使用内部紧缩实现生产zlib的格式输出,并且flate在Go,这
一个DEFLATE实现。我不知道是否可以获取python
zlib库来输出原始的,完整的DEFLATE流,但是尝试获取不同的库来输出压缩数据的逐字节匹配似乎并不有用或无法维护。压缩库的输出仅保证是兼容的,而不是完全相同的。



 类似资料:
  • 问题内容: 我有2种变量。检查Go游乐场,我不明白为什么会这样。问题:我从中得到的应该是将其用于GORM 功能。 代码: 问题答案: TL; DR: 在第一种情况下,您传递了用于打印的type值,但在第二种情况下,您传递了type的值!该动词表示使用默认格式进行格式化,但是默认格式取决于值的类型。 您看到的区别只是包实现的默认格式设置规则。 您正在使用: 它以格式字符串和其他参数作为类型。因此请注

  • 本文向大家介绍Golang中Goroutine和Thread之间的区别。,包括了Golang中Goroutine和Thread之间的区别。的使用技巧和注意事项,需要的朋友参考一下 古鲁丁 Goroutine是可以与其他goroutine一起独立执行的方法/功能。Go语言中的每个并发活动通常都称为gorountine。 线 线程是一个轻量级的过程。可以将其视为执行一段代码的单元。操作系统管理线程。

  • 问题内容: 我有: 哪个追加到缓冲区,是否可以写入缓冲区的开头? 问题答案: 由于基础不是从导出的,因此您可以使用: 试试这个The Go Playground: 输出:

  • 问题内容: 用Go编写了一些脚本后,我问自己--file 的编译与以后的执行以及命令在性能等方面是否有区别。 如果使用以下方法之一启动Web服务,会有什么好处? 问题答案: 只是编译然后在单个步骤中运行的快捷方式。尽管它对开发很有用,但通常应将其构建并在生产中使用它时直接运行二进制文件。

  • 问题内容: 开发golang http应用程序时,我经常使用。访问请求主机地址时,我会使用,但是我发现有字段,但是当我打印它时,它是空的。 http.Request的文档提供了以下注释,但并没有提供太多线索。 在我看来,请求中有两个主机值:uri行和标头,例如: 但这并没有解决很多问题,它会带来很多问题: 为什么请求中有两个不同的字段?我的意思是这不是重复吗? 同一请求中两个字段可以不同吗? 在哪

  • 问题内容: 我正在尝试为我的应用程序修改golang时区 我看了一下 时间 包,初始化时区发生在 time / zoneinfo_unix.go @ initLocal 该函数只是尝试读取环境变量,如果有效,则将其加载 如果不是,它会回退,如果它无效,则会回退到 到目前为止我尝试过的 1-工作正常-但我不想使用任何一种方法-: 在我的docker文件中,我将ENV传递给了容器, 进入容器重击,运行