سؤال

أتساءل عما إذا كان بإمكان أي شخص أن يلقي بعض الضوء على قضية تدفعني إلى الجنون:

أنا أكتب فئة اختبار تخفيف الضغط.لاختبار ذلك، أقوم بإجراء تسلسل لمجموعة بيانات إلى تدفق الذاكرة، وضغطها، وفك ضغطها ومقارنة النتائج.

الضغط أمر جيد، ولكن عدم الضغط هو المكان الذي يضرب فيه الأوساخ.هذه هي وظيفة فك الضغط:

    public static Stream GetUncompressedStreamCopy(Stream inStream)
    {
      Stream outStream = new MemoryStream();

      inStream.Position = 0;

      DeflateStream uncompressStream = new DeflateStream(inStream, 
        CompressionMode.Decompress, true);

      byte[] buffer = new byte[65536];

      int totalread = 0;
      int bytesread = 0;


      do {
        bytesread = uncompressStream.Read(buffer, 0, buffer.Length);
        totalread += bytesread;
        outStream.Write(buffer, 0, bytesread);
        Console.WriteLine("bytesRead: [{0}]\t outStream.Length [{1}]",
        bytesread, outStream.Length);
      } while (bytesread > 0);


      Console.WriteLine("total bytes read [{0}]", totalread);
      outStream.Flush();
      return outStream;
}

مع المخزن المؤقت بحجم 65536، يُرجع الدفق غير المضغوط دائمًا بايتًا واحدًا أقل مما كان عليه في حالة عدم الضغط.

والآن يقودني هذا إلى المشكلة الثانية التي أتعامل معها.مع بعض أحجام المخزن المؤقت، يقوم uncompressStream.Read بإرجاع 0 على الرغم من أنه لا يزال هناك بيانات مضغوطة متبقية لاستخراجها.

في هذه الحالات، deflateStream.Read(s) مرة واحدة فقط في حلقة do{} ثم تُرجع دفقًا غير مضغوط يساوي حجم المخزن المؤقت، إذا قمت بزيادة حجم المخزن المؤقت ببايت واحد، فكل شيء على ما يرام (باستثناء البايت المفقود).

إخراج حجم المخزن المؤقت 65536:(البيانات الأصلية غير المضغوطة هي 207833)

bytesRead: [65536]       outStream.Length [65536]
bytesRead: [65536]       outStream.Length [131072]
bytesRead: [58472]       outStream.Length [189544]
bytesRead: [18288]       outStream.Length [207832]
bytesRead: [0]           outStream.Length [207832]
total bytes read [207832]

حجم المخزن المؤقت 189544 (بعض الأرقام السحرية التي يوجد بها خزانات الكود)

bytesRead: [189544]      outStream.Length [189544]
bytesRead: [0]           outStream.Length [189544]
total bytes read [189544]
Unompressed stream size 189544

لاحظ أيضًا القراءة الثالثة لحجم المخزن المؤقت 65536 على سبيل المثال:قراءة البايت:[58472] من الواضح أن هذا يجب أن يكون أيضًا 65536 حيث لا تزال هناك بيانات متبقية في المخزن المؤقت؟

أي أفكار ستكون إلى حد كبير مُقدَّر.

تيا

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

المحلول

يجب عليك دائمًا استدعاء Close() على تدفقات الضغط.يرجى ملاحظة أن Flush () هو ليس كافي.أظن أنه بسبب هذا فإن تيار التفريغ يفتقد البيانات.

نصائح أخرى

تخبرني قوتي النفسية أن لديك في الواقع تطبيقًا فعالاً لتخفيف الضغط، لكنك نسيت مسح تدفق الضغط من قبل.

حسنًا، لم أتمكن من اكتشاف مشكلتك، لكن اتبع بعض التعليمات البرمجية التي كتبتها منذ فترة ICSharpCode.SharpZipLib;

byte[] compressedData;
using(MemoryStream ms = new MemoryStream())
{
    Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION, true);
    Stream s = new DeflaterOutputStream(ms, deflater);
    s.Write(sendData, 0, sendData.Length);
    s.Close();
    compressedData = (byte[])ms.ToArray();
}

// ...

MemoryStream inflated = new MemoryStream();
using (Stream inflater = new InflaterInputStream(
    inputStream, new Inflater(true)))
{
    int count = 0;
    byte[] deflated = new byte[4096];
    while ((count = inflater.Read(deflated, 0, deflated.Length)) != 0)
    {
        inflated.Write(deflated, 0, count);
    }
    inflated.Seek(0, SeekOrigin.Begin);
}
byte[] content = new byte[inflated.Length];
inflated.Read(content, 0, content.Length);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top