无法在 C# 中解压缩 - 此消息使用什么压缩方法?

Unable to decompress in C# - what compression method is this message using?

我有一个base64字符串qsZhqyXY0rTEnOLUWgAAAAD//w==
这表示使用(我相信)zlib 压缩的 JSON 格式的 UTF8 字符串。我不知道 JSON.

的确切内容

我首先将这个字符串转换为字节:

var bytes = Convert.FromBase64String(base64string);
foreach (var b in bytes) Console.Write($"{b:x2} ");
// aa c6 61 ab 25 d8 d2 b4 c4 9c e2 d4 5a 00 00 00 00 ff ff

最后是标准的 00 00 ff ff,但是 none 的 zlib 魔法 headers 我知道:

通常,我的理解是,在使用 DeflateStream 时,您应该删除指定压缩类型的前两个字节。这是我解压这个字节数组的方法,它删除了 header,但是即使不删除 header 它也会失败。

public static byte[] InflateByteArray(byte[] bytes)
{
    var outputStream = new MemoryStream();
    MemoryStream inputStream = new MemoryStream(bytes, 2, bytes.Length - 2); 
    
    using var deflateStream = new DeflateStream(inputStream, CompressionMode.Decompress);
    deflateStream.CopyTo(outputStream); // exception here
    
    return outputStream.ToArray();
}

当我在上面的字节数组上 运行 这个方法时,我得到一个 System.IO.InvalidDataException 和消息 'The archive entry was compressed using an unsupported compression method.'。

为什么会这样?此邮件使用什么压缩方法?

尝试以下操作:

           string input = "aa c6 61 ab 25 d8 d2 b4 c4 9c e2 d4 5a 00 00 00 00 ff ff";
            byte[] bytes = input.Split(new char[] { ' ' }).Select(x => byte.Parse(x, System.Globalization.NumberStyles.HexNumber)).ToArray();
            MemoryStream ms = new MemoryStream(bytes);
            ms.Position = 0;
            System.IO.Compression.DeflateStream gzip = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Decompress);
            List<byte> uncompressed = new List<byte>();
            int bytesRead = 0;
            do
            {
                byte[] chunk = new byte[1000];
                bytesRead = gzip.Read(chunk, 0, 1000);
                uncompressed.AddRange(chunk.ToList().GetRange(0,bytesRead));
            } while (bytesRead == 1000);

这是来自 deflate 流中间 的一小段 deflate 数据。如果没有至少在它之前的放气流,它对你没有好处。它的放气“反汇编”给出:

fixed
literal '{
match 23 118
literal '9
match 5 117
literal 'false}
end
stored
end

match 23 118 表示要从 way 复制字节,在此小 deflate 片段中提供的数据之前。 (之前的 117 个字节。)第二个相同 match。解压后的数据是一个{,你不知道的过去的23个字节,一个9,还有五个你不知道的字节,false}.

None 个 deflate 块被标记为最后一个块,因此此代码段后有更多 deflate 数据。

末尾的空存储块,您称之为 “末尾的标准 00 00 ff ff 实际上不是标准的。这就是当压缩流由于某种原因被分解成小块进行传输时插入的内容,以便将每个块带到字节边界。通常 deflate 块可以从任何位位置开始。您不会在正常压缩的 deflate 流中找到它们。