在 C# 中解压字节数组

Unzip Byte Array in C#

我正在研究 EBICS 协议,我想读取 XML 文件中的数据以与另一个文件进行比较。

我已使用 base64 成功解码数据 Convert.FromBase64String(OrderData); 但现在我有一个字节数组。

要阅读内容,我必须将其解压缩。我尝试像这个例子一样使用 Gzip 解压缩它:

static byte[] Decompress(byte[] data)
{
    using (var compressedStream = new MemoryStream(data))
    using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
    using (var resultStream = new MemoryStream())
    {
        zipStream.CopyTo(resultStream);
        return resultStream.ToArray();
    }
}

但它不起作用我收到一条错误消息:

the magic number in gzip header is not correct. make sure you are passing in a gzip stream

现在我不知道如何解压缩它,请帮助我!

谢谢!

尝试使用 SharpZipLib。它应对各种压缩格式,并且在 GPL 许可下是免费的。

正如其他人所指出的,我怀疑您使用的是 zip 流,而不是 gzip。如果您检查十六进制视图中的前 4 个字节,ZIP 文件始终以 0x04034b50 ZIP File Format Wiki whereas GZIP files start with 0x8b1f GZIP File Format Wiki

开头

我想我终于明白了——和往常一样,问题不在于标题中的内容。幸运的是,我注意到您 post 中的 EBICS 一词。因此,根据 EBICS 规范,数据首先被压缩,然后 加密 ,最后进行 base64 编码。如您所见,在解码 base64 之后,您首先需要 解密 数据,然后尝试解压缩它。

更新:如果不是这种情况,则从 EBICS 规范第 16 章附录:标准和参考 可以看出 ZIP 引用为 zlib/deflate 格式,所以您需要做的就是将 GZipStream 替换为 DeflateStream

OP 在对另一个答案的评论中提供的前四个字节:0x78 0xda 0xe5 0x98 是 zlib 流的开始。它既不是 gzip,也不是 zip,而是 zlib。您需要一个 ZlibStream,由于某些原因 Microsoft 没有提供。不过没关系,因为 what Microsoft does provide is buggy.

您应该使用 DotNetZip,它提供了 ZlibStream,并且有效。