Frage

Ich habe eine Zeichenfolge, die ich Gzip auf dem Server und Download auf einen Client die WebClient-Klasse. Wenn ich versuche, es zu dekomprimieren, erhalte ich die Fehlermeldung, dass die magische Zahl fehlt. Ich habe versucht, sowohl die GZipStream Klasse und die ICSharpLib Methoden, um dies zu lösen, so dass ich mit einem Verlust.

Die Kompression / Dekompression funktioniert, wenn ich den Schritt des Herunterladens über den WebClient (mit Download, die die Daten als Byte zurückgibt []) weglassen, so kann ich nur annehmen, dass es ein Problem mit den Daten abgeschnitten oder beschädigt bekommen, wie einige , aber da es komprimierte Daten ist, ich bin nicht sicher, wie dies zu debuggen.

Hier ist der Code-Snippet, das der betreffende Teil zu sein scheint:

   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
}

Jede Hilfe wäre sehr geschätzt. P. S. Ich bin mit dem Base64-String der Lage sein, hin und her über die Bahn zu übergeben. Dies kann in der Tat der Bereich sein, in der ich vermassele da ich nicht Web-Anfragen und Antworten zwischen einem Desktop-App und ein Webservice zuvor getan.

War es hilfreich?

Lösung

Erstens, ich glaube nicht, das Snippet gültig ist, weil DownloadString Erträge (wie erwartet) einen String.

Nun verstehe ich richtig, dass es richtig funktioniert, wenn Sie Download verwenden und falsch, wenn Sie verwenden DownloadString? Das macht Sinn, weil es nicht gültig ist gzip-Daten als Unicode zu dekodieren.

EDIT:

Okay, sollten die ToBase64String und FromBase64String in Ordnung sein. Aber wenn man es vermeiden kann, und übergeben Sie die byte [] direkt, das wäre gut.

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

Dann würden Sie loswerden der ersten Zeile der Funktion (die Decodierung von Base64) erhalten. Note Wir sind die Umbenennung encryptedFile zu compressedFile.

Die Zeile:

memStream.ReadByte();

sollte nicht da sein. Sie lesen ein Byte und verwirft sie. Wenn alles wie wir das Byte 0x1F, einen Teil der gzip magischen Zahl erwartet.

Dann denke ich, dass Sie die falsche gzip-Klasse verwenden. Sie wollen GZipStream . Es ist so aufgebaut, wie:

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

Dann verwenden Sie Stream direkt auf, dass:

StreamReader sr = new StreamReader(stream);

Es würde helfen, wenn Sie die Codierung wissen, aber hoffentlich wird der Standard korrekt sein. Dann scheint es von dort richtig. Also, insgesamt erhalten wir die folgenden.

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

    //...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top