我正在研究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流
现在我不知道如何解压缩它,请帮助我!
谢谢!
答案 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