【问题标题】:Different byte array for same string in golang and pythongolang和python中相同字符串的不同字节数组
【发布时间】:2019-12-25 12:48:55
【问题描述】:

我正在使用 python gzip 模块压缩字符串并在 golang 中解压缩。

python中压缩字符串的模块:

gzip.compress(json.dumps("hello").encode(),-1)

在golang中解压的模块:

func Decompression(compData []byte) ([]byte, error) {
    gr, err := gzip.NewReader(bytes.NewBuffer(compData))
    if err != nil {
        return compData, err
    }
    defer gr.Close()
    data, err := ioutil.ReadAll(gr)
    if err != nil {
        return nil, err
    }
    return data, err
}

收到错误:Gzip:invalid header

在压缩和解压缩时使用相同的压缩级别。

谁能指出我正在做的错误?

【问题讨论】:

  • 由于您的问题缺乏详细信息,因此猜测:您使用print 在 Python 中而不是write 中输出压缩结果。 print 用二进制值创建一个可打印的字符串,即b'\x1f\x8b\x08...。这当然不是有效的 gzip。
  • python 语句中没有提到 print。 @Steffen 我需要将压缩数据发布到 kafka,请朝那个方向提供帮助。
  • “我需要将压缩数据发布到 kafka,请朝那个方向提供帮助。” - 这是一个完全不同的问题,应该作为一个新问题提出。但也许看看the Kafka documentation 压缩输入是如何预期的。或者只使用kafka-python

标签: python python-3.x go compression gzip


【解决方案1】:

我尝试过重现,用这段代码(python3)生成文件out.bin

import gzip
import json

with open('out.bin', 'wb') as f:
    f.write(gzip.compress(json.dumps("hello").encode(), -1))

print(json.dumps("hello"))

这段代码读取文件并解压(使用你的Decompression函数:

package main

import (
    "bytes"
    "compress/gzip"
    "fmt"
    "io/ioutil"
)

func Decompression(compData []byte) ([]byte, error) {
    gr, err := gzip.NewReader(bytes.NewBuffer(compData))
    if err != nil {
        return compData, err
    }
    defer gr.Close()
    data, err := ioutil.ReadAll(gr)
    if err != nil {
        return nil, err
    }
    return data, err
}

func main() {
    d, err := ioutil.ReadFile("out.bin")
    if err != nil {
        panic(err)
    }
    fmt.Printf("raw data: %q\n", string(d))
    data, err := Decompression(d)
    if err != nil {
        panic(err)
    }
    fmt.Printf("decompressed: %q\n", string(data))
}

该组合可以正常工作。也许您没有以某种方式从 Python 正确保存文件?你能在你的数据文件上运行我的 go 代码并显示原始字节吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多