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

erhoui1w  于 2023-02-06  发布在  Go
关注(0)|答案(1)|浏览(126)

我有[]字节的zip文件。我必须解压缩它而不创建一个新的文件,并得到一个[]字节的解压缩文件。请帮助我做到这一点。
我正在进行一个API调用,得到的响应是压缩格式的[]byte-我正在尝试解压缩它-并使用它的内容创建一个新的zip文件。
语言:戈兰语
我使用的代码:

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:无效标头”
最初用于压缩[]字节的代码

buffer := new(bytes.Buffer)
zipWriter := zip.NewWriter(buffer)
zipFile, err := zipWriter.Create(file.name)
_, err = zipFile.Write(file.content)

字节的十六进制转储-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....|
brccelvz

brccelvz1#

您使用了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上试试这个。

相关问题