登录
首页 >  Golang >  Go问答

golang和python中相同字符串的不同字节数组

来源:stackoverflow

时间:2024-03-16 15:27:29 140浏览 收藏

**文章首段摘要:** 当使用 Python gzip 模块压缩字符串并在 Go 中解压缩时,如果使用相同的压缩级别,可能会出现 "gzip:无效标头" 错误。这是因为 Python 和 Go 在处理字符串字节数组时存在差异。为了解决此问题,确保在 Python 中正确保存文件,并在 Go 中使用原始字节进行解压缩。

问题内容

我正在使用 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:无效标头

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

有人可以指出我犯的错误吗?


解决方案


我尝试使用此代码(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 代码并显示原始字节吗?

到这里,我们也就讲完了《golang和python中相同字符串的不同字节数组》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>