سؤال

ولدي السلسلة التي I ببرنامج Gzip على الخادم وتحميل إلى عميل باستخدام فئة WebClient. عندما أحاول ضغطه، وأحصل على رسالة الخطأ إلى أن عدد سحر مفقود. لقد حاولت كل فئة GZipStream وأساليب ICSharpLib حل هذا، لذلك أنا في حيرة.

ووضغط / إزالة الضغط يعمل لو حذفت خطوة من تحميل عبر WebClient (باستخدام DownloadData التي ترجع البيانات كما بايت [])، لذلك يمكنني إلا أن نفترض أن هناك بعض المشاكل مع البيانات الحصول على اقتطاع أو تلف بعض كيف ولكن نظرا لأنه البيانات المضغوطة، وأنا لست متأكدا من كيفية تصحيح هذا.

وفيما يلي مقتطف شفرة يبدو أن هذا الجزء المخالف:

   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 لتكون قادرة على تمرير ذهابا وإيابا عبر الويب. وهذا قد يكون في الواقع في منطقة وانا لخبطة في منذ ان كنت لم تفعل طلبات الويب والاستجابات بين التطبيق سطح المكتب وخدمة الإنترنت من قبل.

هل كانت مفيدة؟

المحلول

أولا، أنا لا أعتقد المتكررة صالحا، لأن DownloadString العوائد (كما هو متوقع) سلسلة.

والآن، هل أفهم الحق أنه يعمل بشكل صحيح عند استخدام DownloadData وبشكل غير صحيح عند استخدام DownloadString؟ هذا الأمر يبدو معقولا تماما لأنه لا يصح فك شفرة البيانات ببرنامج Gzip ك Unicode.

وتحرير:

حسنا، يجب أن يكون ToBase64String وFromBase64String بخير. ولكن إذا كان يمكنك تجنب ذلك وتمرير بايت [] مباشرة، التي من شأنها أن تكون جيدة.

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

وبعد ذلك سوف تحصل على التخلص من السطر الأول من وظيفة (فك شفرة من base64 في). ملاحظة أننا إعادة تسمية encryptedFile إلى compressedFile.

والخط:

memStream.ReadByte();

ويجب أن لا يكون هناك. كنت تقرأ بايت ورميه. إذا كان كل شيء ونحن نتوقع أن البايت هو 0x1F، وهي جزء من غزيب الرقم السحري.

وبعد ذلك، أعتقد أنك تستخدم الطبقة غزيب خاطئة. تريد 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"];

    //...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top