【发布时间】: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/flate 或 compress/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