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

我有 [] 字节的 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 的十六进制转储 - zippedBytes


00059350  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....|


慕尼黑的夜晚无繁华
浏览 245回答 1
1回答

MM们

你曾经zip.Writer压缩过数据。您必须通过调用它的方法来关闭它Writer.Close()。并且您必须使用zip.Reader它来读取它,并使用Reader.Open()您在压缩它时使用的相同名称 (&nbsp;file.name)。这就是它的样子:func UnzipBytes(name string, zippedBytes []byte) ([]byte, error) {&nbsp; &nbsp; reader := bytes.NewReader(zippedBytes)&nbsp; &nbsp; zipReader, err := zip.NewReader(reader, int64(len(zippedBytes)))&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return nil, err&nbsp; &nbsp; }&nbsp; &nbsp; f, err := zipReader.Open(name)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; }&nbsp; &nbsp; p, err := ioutil.ReadAll(f)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return nil, err&nbsp; &nbsp; }&nbsp; &nbsp; 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 {&nbsp; &nbsp; panic(err)}if _, err = zipFile.Write(filecontent); err != nil {&nbsp; &nbsp; panic(err)}if err = zipWriter.Close(); err != nil {&nbsp; &nbsp; panic(err)}decoded, err := UnzipBytes(filename, buffer.Bytes())fmt.Println(err)fmt.Println(string(decoded))这将输出(在Go Playground上尝试):<nil>line1line2如果你解压的时候不知道名字,你可能会在Reader.Files头域看到所有的文件。您可以选择打开第一个文件:func UnzipBytes(zippedBytes []byte) ([]byte, error) {&nbsp; &nbsp; reader := bytes.NewReader(zippedBytes)&nbsp; &nbsp; zipReader, err := zip.NewReader(reader, int64(len(zippedBytes)))&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return nil, err&nbsp; &nbsp; }&nbsp; &nbsp; if len(zipReader.File) == 0 {&nbsp; &nbsp; &nbsp; &nbsp; return nil, nil // No file to open / extract&nbsp; &nbsp; }&nbsp; &nbsp; f, err := zipReader.File[0].Open()&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; }&nbsp; &nbsp; p, err := ioutil.ReadAll(f)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return nil, err&nbsp; &nbsp; }&nbsp; &nbsp; return p, nil}这输出相同。在Go Playground试试这个。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go