在C#中解压缩字节数组

问题描述 投票:1回答:3

我正在使用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流

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

谢谢!

c# gzip unzip
3个回答
1
投票

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

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


1
投票

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.