سؤال

ولست بحاجة لتنفيذ تطبيق ZLIB الخاصة التي يجب أن تعمل تحت صافي ومونو. يتم استلام رسائل البيانات / سلسلة عبر مأخذ وبالتالي الاختباري مفقود. هذا هو حول سلسلة البيانات الخام، وليس عن الملفات.

    unsigned char zlib_header[]={
// custom additional Zlib Id
       'Z',    // Our own ID
// The normal GZIP header
       0x1f,
       0x8b,   // GZIP ID
       0x08,   // Deflated
       0x00,   // Flags
       0, 0, 0, 0, // Timestamp,
       0x00,   // Extra flags
       0x00,   // OS identifier
// afterwards compressed data without a checksum
};

ولقد حاولت لضغط البيانات مع GZipStream وDeflateStream، ولكن أعتقد أن GZStream فشل بسبب الاختباري المفقود. لقد حاولت أيضا إزاحة مختلفة، ولكن لم يكن الحظ. لم يتم استخدام الاختباري لتلقي البيانات عبر مأخذ على أي حال - وبالتالي الاختباري ZLIB سيكون مقدار حمل إضافي. وقد فاتني شيء أو هل يمكن أن تشرح لي كيفية إضافة الاختباري واستدعاء مكتبة الصحيحة ثم أو ينبغي أن ننظر إلى مكتبة 3rd الطرف الذي يدعم مونو وصافي؟ تحرير: الأداء حرجة للغاية لأن هذا القيام به مرة واحدة على الأقل في الثانية. تنصحين لي في النهاية إلى استخدام C-ليب عبر إمكانية التشغيل المتداخل؟ أتلقى دائما استثناء بيانات غير صالح في الوقت الحالي وأفترض أنها تتعلق الاختباري خاطئ. هذا هو رمز الفعلية التي حاولت استخدام دون نجاح:

const int HeaderSize = 1;
System.IO.MemoryStream ms = new System.IO.MemoryStream(compressedBuffer, HeaderSize, compressedBuffer.Length-HeaderSize);//remove the additional Z from the header
GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress,true);
byte[] deCompressedBytes = new byte[actualBufferLength* 10];
int resultSize=zipStream.Read(deCompressedBytes, 0, actualBufferLength);//get rid of the header      
UTF8Encoding enc = new UTF8Encoding();
string result = enc.GetString(deCompressedBytes, 0, resultSize);
هل كانت مفيدة؟

المحلول

هل أنت متأكد من أنها لديها ما تفعله مع الاختباري؟

والاختباري 32 بت ليست اختيارية في شكل GZIP. أنا لا أفهم ما تقصد ب "تلقي البيانات عبر مأخذ بالتالي الاختباري مفقود". لا يهم إذا كنت تحصل على البيانات عن طريق الحمام الزاجل. إذا كان تيار GZIP صحيح، فإنه يجب أن يكون CRC 32 بت. منظمة الصحة العالمية أو ما أنتجت مصدر البيانات؟

وهناك جزء اختياري في المواصفات GZIP - الاختباري 16 بت. (كما لا تستند إدراجه على كيفية إنشاء bytestream GZIP.) والطبقة System.IO.GZipStream يقبل بكل سرور تيار GZIP الذي يفتقر إلى هذه CRC16، فضلا عن واحد يتضمن ذلك.

لديك بعض المشاكل الأخرى في التعليمات البرمجية. وactualBufferLength في التعليمات البرمجية - ما هو؟ ومن المؤكد أنه ليس طول المخزن المؤقت لاحتواء البيانات ضغط. وهذا هو 10X. ولكن يبدو 10X التعسفي جدا. للحصول على بيانات انضغاط جدا، وكنت قد تتجاوز 10X. أقترح عليك استخدام نهج تدفق في الضغط.

وأما عن ما إذا كنت سوف تكون قادرة على التعامل مع الضغط 1 في الثانية، نعم، وSystem.IO.GZipStream سوف تكون سريعة بما يكفي لقطع صغيرة بما يكفي من البيانات. من المرجح أن يكون هناك حاجة للذهاب إلى / مكتبة الأصلي C ++ C.

ملاحظة: إن DotNetZip تتضمن المكتبة GZipStream التي هي مفتوحة المصدر؛ يمكنك استخدامه من خارج منطقة الجزاء أو إذا أردت، يمكنك فقط انتزاع الاشياء غزيب إذا كان هذا هو كل ما تحتاج.

نصائح أخرى

ومجرد استخدام DeflateStream بدلا من GZipStream.

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