在c#中解压缩字节数组

本文关键字:字节数 数组 字节 解压缩 | 更新日期: 2023-09-27 18:17:41

我正在研究ebic协议,我想在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();
    }
}

但是它不工作,我有一个错误消息:

gzip头中的幻数不正确。确保传入的是gzip流

现在我不知道怎么解压缩它,请帮助我!

谢谢!

在c#中解压缩字节数组

OP在另一个答案的注释中提供的前四个字节:0x78 0xda 0xe5 0x98是zlib流的开始。它既不是gzip也不是zip,而是zlib。你需要一个ZlibStream,由于某种原因微软没有提供。不过这没关系,因为微软提供的是有bug的。

您应该使用DotNetZip,它提供了ZlibStream,它可以工作。

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

正如其他人指出的那样,我怀疑您使用的是zip流而不是gzip。如果您检查十六进制视图中的前4个字节,ZIP文件总是以0x04034b50 ZIP文件格式Wiki开始,而GZIP文件以0x8b1f GZIP文件格式Wiki开始

我想我终于明白了——像往常一样,问题不在于标题是什么。幸运的是,我在你的帖子中注意到了ebic这个词。因此,根据ebic规范,首先对数据进行压缩,然后对进行加密,最后对进行base64编码。如您所见,在解码base64之后,您需要首先解密数据,然后尝试解压缩它。

UPDATE:如果不是这样,那么从eics规范第16章附录:标准和参考中可以看出ZIP引用的是zlib/deflate格式,因此您需要做的就是将GZipStream替换为DeflateStream