在C#中解压字节数组

3

我正在处理EBICS协议,想要读取XML文件中的数据并与另一个文件进行比对。

成功使用Convert.FromBase64String(OrderData);解码了Base64数据,但现在得到的是字节数组。

为了读取内容,需要对其进行解压缩。我尝试使用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流。

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

谢谢!


1
你能展示一下你是如何压缩数据的吗? - Rahul Tripathi
我还没有压缩数据,我想读取已经压缩的数据。 - Thomas Rollet
它没有使用GzipStream进行编码,但在我的.NET Framework中只有这一个可用。 - Thomas Rollet
数据首先被压缩并进行Base64编码。 - Thomas Rollet
byte[] data 保存到临时文件中,然后尝试从Windows资源管理器中打开它。你可以吗?使用哪个程序? - Ivan Stoev
显示剩余2条评论
3个回答

1
尝试使用 SharpZipLib。它可以处理各种压缩格式,并且在GPL许可下免费。
正如其他人所指出的,我怀疑您有一个zip流而不是gzip。如果在十六进制视图中检查前4个字节,ZIP文件总是以0x04034b50 ZIP File Format Wiki开头,而GZIP文件以0x8b1f GZIP File Format Wiki开头。

这不是一个文件,只是一个字节数组。 - Thomas Rollet
请列出前4个字节。 - Paul
将你的第一个数字120218229152217转换为十六进制得到0x72A6275,这是我不熟悉的。你的编辑也是一个陌生的序列。 - Paul

1

OP在对另一个答案的评论中提供的前四个字节:0x78 0xda 0xe5 0x98是zlib流的开头。它既不是gzip,也不是zip,而是zlib。您需要一个ZlibStream,但出于某种原因,Microsoft没有提供。不过没关系,因为Microsoft提供的内容存在问题

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


0

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

更新: 如果不是这种情况,则从EBICS规范的第16章 附录:标准和引用中可以得知,ZIP指的是zlib/deflate格式,所以你只需要将GZipStream替换为DeflateStream即可。


在HIA请求中,EBICS消息中的订单未加密。 - Thomas Rollet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接