在C#中解压缩字节数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中解压缩字节数组相关的知识,希望对你有一定的参考价值。

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

我已经使用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();
    

但是它不起作用,我有一条错误消息:

gzip标头中的魔术数字不正确。确保您正在传递gzip流

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

谢谢!

答案

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

您应该使用提供DotNetZipZlibStream,并且可以使用。

另一答案

尝试使用SharpZipLib。它可以处理各种压缩格式,并且根据GPL许可是免费的。

正如其他人指出的,我怀疑您有一个zip流而不是gzip。如果在十六进制视图中检查前4个字节,则ZIP文件始终以0x04034b50 ZIP File Format Wiki开头,而GZIP文件始终以0x8b1f GZIP File Format Wiki]开头

另一答案

我想我终于明白了-像往常一样,问题不在标题中。幸运的是,我在您的帖子中注意到了EBICS这个词。因此,根据EBICS规范,首先对数据进行压缩,然后进行[[encrypted]],最后进行base64编码。如您所见,在对base64进行解码之后,您需要先decrypt

以上是关于在C#中解压缩字节数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET 中解压缩使用 Lempel-Ziv Haruyasu 算法压缩的字节?

使用iter_chunks()从S3中解压缩字节块。

如何在 ruby​​ 中解压缩大于 64 位的数字?

使用 Ruby 从二进制字符串中解包一点

如何从字节数组元素中解包/提取低阶和高阶值

在 VB.net 中解压缩文件 [关闭]