سؤال

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

كانت محاولتي الأولى هي استخدام deflatestream ، لكن عندما أرسل الجزء الأول لن تظهر بياناتها المضغوطة حتى أغلق الدفق.

القراءة عن أوضاع تدفق Zlib يبدو كما لو كان هناك وضع واحد محدد لما أحتاجه.

  1. هل أستخدم الفئة الصحيحة (deflatestream) لضغط ZLIB DEFLATE؟
  2. كيف يمكنني تمكين سلوك "Sync Flush"؟
هل كانت مفيدة؟

المحلول

ال dotnetzip يحتوي Project على Zlib فرعي يحتوي على تنفيذ deflatestream من تلقاء نفسه.

يحتوي هذا التنفيذ على خاصية أخرى تدعى FlushMode:

DeflateStream deflate = new DeflateStream(stream, CompressionMode.Compress);
deflate.FlushMode = FlushType.Sync;
deflate.Write (data, 0, data.Length);
//No call to deflate.Flush() needed, automatically flushed on every write.

نصائح أخرى

إنه في الواقع فقط تدفق على قرب. ستحتاج إلى استخدام مثيل deflatestream مختلف في كل مرة ، يمر حقيقي إلى مُنشئ محمّل تخبرها ليس لإغلاق الأساسية دفق عند إغلاق deflatestream.

للإجابة على سؤالك حول كيفية تمكين سلوك "Sync Flush" ، يجب أن ترى مثال zpipe.c في رمز مصدر ZLIB.
استبدل السطر الأول بالخط الثاني الموضح أدناه

Deflate() سيعود في كل مرة يكون فيها المخزن المؤقت للإخراج ممتلئًا أو عندما يكون المخزن المؤقت الإدخال فارغًا في هذه الأثناء ، تتماسك للتيار المضغوط ، وهي كتلة حرفية فارغة تسمى أيضًا "Sync Flush" إلا في النهاية وهي هي Z_FINISH علَم.

    flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
    flush = feof(source) ? Z_FINISH : Z_SYNC_FLUSH;
    ret = deflate(&strm, flush);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top