为了账号安全,请及时绑定邮箱和手机立即绑定

将压缩的 []byte 转换为解压 []byte golang 代码

将压缩的 []byte 转换为解压 []byte golang 代码

Go
慕尼黑的夜晚无繁华 2023-02-14 15:46:33
我有 [] 字节的 zip 文件。我必须在不创建新文件的情况下解压缩它,并获取该解压缩文件的 [] 字节。请帮助我做到这一点。我正在进行 API 调用,我得到的响应是压缩格式的 []byte - 我正在尝试解压缩它 - 并使用它的内容创建一个新的 zip 文件。所以解压缩 - 重新压缩。Language: Golang我用过的代码:func UnzipBytes(zippedBytes []byte) ([]byte, error) {    reader := bytes.NewReader(zippedBytes)    zipReader, err := zlib.NewReader(reader)    if err != nil {        return nil, err    }    defer zipReader.Close()    p, err := ioutil.ReadAll(zipReader)    if err != nil {        return nil, err    }    return p, nil}我收到一条错误消息“zlib:无效标头”最初用于压缩 []byte 的代码buffer := new(bytes.Buffer)zipWriter := zip.NewWriter(buffer)zipFile, err := zipWriter.Create(file.name)_, err = zipFile.Write(file.content)[]byte 的十六进制转储 - zippedBytes00059350  78 b4 5b 0d 2b 81 c2 87  35 76 1b 11 4a ec 07 d1  |x.[.+...5v..J...|00059360  76 77 a2 e1 3b d9 12 e2  51 d4 c5 bd 4b 2f 09 da  |vw..;...Q...K/..|00059370  f7 21 c7 26 73 1f 8e da  f0 ff a3 52 f6 e2 00 e6  |.!.&s......R....|
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

你曾经zip.Writer压缩过数据。您必须通过调用它的方法来关闭它Writer.Close()。并且您必须使用zip.Reader它来读取它,并使用Reader.Open()您在压缩它时使用的相同名称 ( file.name)。

这就是它的样子:


func UnzipBytes(name string, zippedBytes []byte) ([]byte, error) {

    reader := bytes.NewReader(zippedBytes)

    zipReader, err := zip.NewReader(reader, int64(len(zippedBytes)))

    if err != nil {

        return nil, err

    }

    f, err := zipReader.Open(name)

    if err != nil {

        panic(err)

    }

    p, err := ioutil.ReadAll(f)

    if err != nil {

        return nil, err

    }

    return p, nil

}

测试它:


filename := "test.txt"

filecontent := []byte("line1\nline2")


buffer := new(bytes.Buffer)

zipWriter := zip.NewWriter(buffer)

zipFile, err := zipWriter.Create(filename)

if err != nil {

    panic(err)

}

if _, err = zipFile.Write(filecontent); err != nil {

    panic(err)

}

if err = zipWriter.Close(); err != nil {

    panic(err)

}


decoded, err := UnzipBytes(filename, buffer.Bytes())

fmt.Println(err)

fmt.Println(string(decoded))

这将输出(在Go Playground上尝试):


<nil>

line1

line2

如果你解压的时候不知道名字,你可能会在Reader.Files头域看到所有的文件。您可以选择打开第一个文件:


func UnzipBytes(zippedBytes []byte) ([]byte, error) {

    reader := bytes.NewReader(zippedBytes)

    zipReader, err := zip.NewReader(reader, int64(len(zippedBytes)))

    if err != nil {

        return nil, err

    }

    if len(zipReader.File) == 0 {

        return nil, nil // No file to open / extract

    }

    f, err := zipReader.File[0].Open()

    if err != nil {

        panic(err)

    }

    p, err := ioutil.ReadAll(f)

    if err != nil {

        return nil, err

    }

    return p, nil

}

这输出相同。在Go Playground试试这个。



查看完整回答
反对 回复 2023-02-14
  • 1 回答
  • 0 关注
  • 243 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信