C# 用C语言解压字节数组#

C# 用C语言解压字节数组#,c#,gzip,unzip,C#,Gzip,Unzip,我正在研究EBICS协议,我想读取XML文件中的数据,以便与另一个文件进行比较 我已成功使用 Convert.FromBase64String(OrderData)

我正在研究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流

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

谢谢

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


正如其他人所指出的,我怀疑您有一个zip流,而不是gzip。如果在十六进制视图中检查前4个字节,ZIP文件总是以0x04034b50开头,而GZIP文件则以0x8b1f开头,我想我终于找到了它-像往常一样,问题不在于标题中的内容。幸运的是,我在你的帖子中注意到了EBICS这个词。因此,根据EBICS规范,首先对数据进行压缩,然后进行加密,最后进行base64编码。如您所见,在解码base64之后,您需要首先对数据进行解密,然后尝试解压缩


更新:如果不是这样,那么从EBICS规范第16章附录:ZIP引用的zlib/deflate格式的标准和参考中可以看出,因此,您所需要做的就是将
GZipStream
替换为OP在另一个答案的注释中提供的前四个字节:
0x78 0xda 0xe5 0x98
是zlib流的开始。它既不是gzip,也不是zip,而是zlib。您需要一个
ZlibStream
,由于某些原因,Microsoft没有提供。那很好,因为


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

您可以演示如何压缩数据吗?我没有压缩数据,我想读取压缩的数据。你确定你的
OrderData
在编码到base64并写入XML文件之前已经用
GZipStream
压缩过吗?它不是用GZipStream编码的,但在我的.NET框架中只有一个可用。那么它是如何编码的?它不是一个文件,只是字节数组列出前4个字节。将您的第一个数字120218229152217转换为十六进制将得到0x72A6275,我不熟悉。您的编辑也是一个不熟悉的序列。在HIA请求中,EBICS消息中的订单未加密