在C#中解压缩字节数组

时间:2015-10-14 07:24:44

标签: c# gzip unzip

我正在研究EBICS协议,我想读取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流

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

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

开头

答案 1 :(得分:1)

OP在另一个答案的注释中提供的前四个字节:<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <!-- The main content view --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- The left navigation drawer --> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/list_background" android:choiceMode="singleChoice" android:divider="@color/list_divider" android:dividerHeight="1dp" /> <!-- The right navigation drawer --> <ListView android:id="@+id/right_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="end" android:background="@color/list_background" android:choiceMode="singleChoice" android:divider="@color/list_divider" android:dividerHeight="1dp" /> </android.support.v4.widget.DrawerLayout> 是zlib流的开头。它既不是gzip,也不是zip,而是zlib。您需要一个0x78 0xda 0xe5 0x98,由于某些原因,Microsoft不提供。这很好,但是what Microsoft does provide is buggy

您应该使用DotNetZip,它提供ZlibStream,并且有效。

答案 2 :(得分:0)

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

更新:如果不是这样,那么从EBICS规范第16章附录:标准和参考中可以看出ZIP指的是zlib / deflate格式,所以所有您需要做的是将GZipStream替换为DeflateStream