如何解决Gzip已神奇的数字失踪 [英] How to solve Gzip Magic Number Missing

查看:174
本文介绍了如何解决Gzip已神奇的数字失踪的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个字符串,我Gzip已在服务器上,下载使用WebClient类的客户端。当我尝试解压缩,我得到的是缺少一个神奇的数字错误消息。我曾尝试都GZipStream类和解决这个的ICSharpLib方法,所以我无所适从。

I have a string that I Gzip on the server and download to a client using the WebClient class. When I try to uncompress it, I get the error message that the Magic Number is missing. I have tried both the GZipStream class and the ICSharpLib methods of solving this, so I'm at a loss.

压缩/解压缩工作,如果我省略下载的步骤通过Web客户端(使用DownloadData返回的数据字节[]),所以我只能假设有一些问题,数据获取截断或破坏了一些怎么样,但是因为它的压缩数据,我不知道怎么调试这

The compression/decompression works if I omit the step of downloading via the WebClient (using DownloadData which returns the data as byte[]), so I can only assume that there is some problem with the data getting truncated or corrupted some how, but since it's compressed data, I'm not sure how to debug this.

下面是这似乎是有问题的部分代码片段:

Here's the code snippet that seems to be the offending portion:

   byte[] response
   try {
        response = client.DownloadData(Constants.GetSetting("SyncServer"));
   } catch {
        MessageBox.Show("There was a problem synchronizing the data. Please try verify the supplied credentials or try again later.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
   }

   int rows = SQLiteAPI.ImportStatHistoryXML(CurrentUser.User, myCampus, Convert.ToBase64String(response));

public static int ImportStatHistoryXML(Person tempPerson, Campus tempCampus, string xmlFile) {
    		byte[] encryptedFile = Convert.FromBase64String(xmlFile);
    		MemoryStream memStream = new MemoryStream(encryptedFile);
    		memStream.ReadByte();
    		GZipInputStream stream = new GZipInputStream(memStream);
    		MemoryStream memory = new MemoryStream();
    		byte[] writeData = new byte[4096];
    		int size;

    		while (true) {
    			size = stream.Read(writeData, 0, writeData.Length);
    			if (size > 0) {
    				memory.Write(writeData, 0, size);
    			} else {
    				break;
    			}
    		}
    		stream.Close();
    		memory.Position = 0;
    		StreamReader sr = new StreamReader(memory);
    		string decompressed = sr.ReadToEnd();
    		DataSet tempSet = new DataSet();
    		StringReader xmlReader = new StringReader(decompressed);
    		tempSet.ReadXml(xmlReader);
    		DataTable statTable = tempSet.Tables["Stats"];
...more unrelated processing of the table
}



任何帮助将可以理解的。附:我使用的是Base64编码字符串能够通过来回整个网络。这实际上可能是我的,因为我已经没有做一个桌面应用程序和之前的Web服务之间的Web请求和响应搞乱的区域。

Any help would be appreciated. P.S. I'm using the Base64 string to be able to pass back and forth across the web. This may in fact be the area I am messing up in since I've not done web requests and responses between a desktop app and a web service before.

推荐答案

首先,我不认为段是有效的,因为DownloadString回报率(预期)的字符串。

First, I don't think the snippet is valid, because DownloadString returns (as expected) a String.

现在,做我的理解对不对它工作正常,当您使用DownloadData和不正确时使用DownloadString? 。这是有道理的,因为它是无效的解码Gzip已数据为Unicode

Now, do I understand right that it works correctly when you use DownloadData and incorrectly when you use DownloadString? That makes sense because it is not valid to decode Gzip data as Unicode.

编辑:

好了, ToBase64String和FromBase64String应该没问题。但是,如果你能避免它并传递的byte []直接,那将是一件好事。

Okay, the ToBase64String and FromBase64String should be okay. But if you can avoid it and pass the byte[] directly, that would be good.

public static int ImportStatHistoryXML(Person tempPerson, Campus tempCampus, byte[] compressedFile) {

那么你会摆脱第一线功能(从BASE64解码)。请注意我们重命名为encryptedFile compressedFile

Then you would get rid of the first line of the function (the decode from base64). Note we're renaming encryptedFile to compressedFile.

行:

memStream.ReadByte();



不应该在那里。你正在阅读一个字节并丢弃它。如果一切都如我们预期字节是0x1F的,gzip的幻数的一部分。

should not be there. You are reading a byte and discarding it. If everything is as we expect that byte is 0x1F, part of the gzip magic number.

然后,我觉得你使用了错误的gzip类。你想 GZipStream 。它的构造,如:

Then, I think you're using the wrong gzip class. You want GZipStream. It is constructed like:

GZipStream stream = new GZipStream(memStream, CompressionMode.Decompress);



然后,您可以直接在使用的StreamReader:

Then, you use StreamReader directly on that:

StreamReader sr = new StreamReader(stream);

如果你知道的编码,但希望默认将是正确的这会有所帮助。然后,它似乎从那里正确的。因此,总体而言,我们得到以下。

It would help if you knew the encoding, but hopefully the default will be correct. Then it seems correct from there. So, overall we get the below.

public static int ImportStatHistoryXML(Person tempPerson, Campus tempCampus, byte[] compressedFile) {
    MemoryStream memStream = new MemoryStream(compressedFile);
    GZipStream gzStream = new GZipStream(memStream, CompressionMode.Decompress);
    StreamReader sr = new StreamReader(gzStream);
    string decompressed = sr.ReadToEnd();
    DataSet tempSet = new DataSet();
    StringReader xmlReader = new StringReader(decompressed);
    tempSet.ReadXml(xmlReader);
    DataTable statTable = tempSet.Tables["Stats"];

    //...
}

这篇关于如何解决Gzip已神奇的数字失踪的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆