【问题标题】:How do I decompress this on golang?如何在 golang 上解压?
【发布时间】:2021-08-28 02:32:27
【问题描述】:

我正在尝试将一些 C# 代码移植到 Golang,所以假设我有这个 C# 代码压缩了一些字节:

        public byte[] Compress(byte[] input, int outputSize)
        {
            ZStream zStream = new ZStream();
            zStream.deflateInit(zlibConst.Z_DEFAULT_COMPRESSION, -15);
            byte[] output = new byte[outputSize];

            zStream.next_in = input;
            zStream.next_in_index = 0;
            zStream.avail_in = input.Length;
            zStream.next_out = output;
            zStream.next_out_index = 0;
            zStream.avail_out = output.Length;

            var ret = zStream.deflate(zlibConst.Z_SYNC_FLUSH);
            if (ret != zlibConst.Z_OK)
            {
                throw new Exception($"[NetworkMessage.PrepareToParse] zlib inflate failed: {ret}");
            }
            return output;

        }

如何使用 Golang 解压缩这些字节?

我认为这很容易,使用 compress/flatecompress/zlib,编写如下内容:

func Decompress(input []byte) ([]byte, error) {
    r := flate.NewReader(bytes.NewReader(input))
    decompressed, err := ioutil.ReadAll(r)
    if err != nil {
        return nil, err
    }
    return decompressed, nil
}

但这会导致unexpected EOF,而compress/zlib 会导致zlib: invalid header,我想这是有道理的,因为它不是完整的zlib 流。

【问题讨论】:

  • 你能提供一个样本压缩和原始数据吗?最好使用像 input = []byte{...} 这样的切片文字,这样我们就可以立即尝试。

标签: c# go compression zlib


【解决方案1】:

flate 可以工作。你的问题是在压缩方面。 flate 报告流意外结束,因为您没有结束它。您需要使用Z_FINISH,而不是Z_SYNC_FLUSH

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多