如何解决Gzip已神奇的数字失踪(How to solve Gzip Magic Number Mi

2019-06-23 20:19发布

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

压缩/解压缩工作,如果我省略通过(使用DownloadData它返回该数据作为字节[])Web客户端下载的步骤,所以我只能假设有一些问题与所述数据获取截短或损坏了一些如何,但由于它的压缩数据,我不知道如何调试这一点。

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

   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
}

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

Answer 1:

首先,我不认为片段是有效的,因为DownloadString收益(预期)的字符串。

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

编辑:

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

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

然后你会摆脱功能(从BASE64解码)的第一线。 注意,我们重命名encryptedFile到compressedFile。

该行:

memStream.ReadByte();

应不应该存在。 您正在阅读一个字节并丢弃它。 如果一切都在我们预计字节为0x1F,gzip的幻数的一部分。

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

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

然后,你就可以直接使用StreamReader的:

StreamReader sr = new StreamReader(stream);

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

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"];

    //...
}


文章来源: How to solve Gzip Magic Number Missing