سؤال

النظام.IO.ضغط.GZipStream أو نظام.IO.ضغط.وفرغ متوافق مع zlib ضغط ؟

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

المحلول

من MSDN عن النظام.IO.ضغط.GZipStream:

تمثل هذه الفئة gzip تنسيق البيانات الذي يستخدم معيار الصناعة خوارزمية ضياع ضغط الملف و الضغط.

من zlib التعليمات:

Gz* وظائف في zlib من ناحية أخرى استخدام gzip الشكل.

حتى zlib و GZipStream يجب أن تكون قابلة للتشغيل المتبادل ، ولكن فقط إذا كنت تستخدم zlib وظائف التعامل مع gzip الشكل.

النظام.IO.ضغط.وفرغ و zlib ويقال غير قابلة للتشغيل المتبادل.

إذا كنت بحاجة إلى التعامل مع ملفات zip (ربما لا, ولكن هناك شخص آخر قد تحتاج هذا) تحتاج إلى استخدام SharpZipLib أو مكتبة خارجية أخرى.

نصائح أخرى

DotNetZip يتضمن DeflateStream ، ZlibStream ، GZipStream ، التعامل مع RFC 1950 و 1951 و 1952.كل استخدام فرغ الخوارزمية ولكن تأطير رأس بايت مختلفة لكل واحد.

كما ميزة ، تيارات في DotNetZip لا يحمل الشذوذ توسيع حجم البيانات تحت ضغط ، وذكرت ضد المدمج في تيارات.أيضا ، ليس هناك المدمج في ZlibStream ، بينما DotNetZip يعطيك ذلك من أجل الخير إمكانية التشغيل المتداخل مع zlib.

أنا واجهت هذه المشكلة مع بوابة الكائنات.في حالة تخزين الكائنات كما بددت النقط مع Zlib رأس ، الذي تم توثيقه في RFC 1950.يمكنك جعل متوافق النقطة بجعل ملف يحتوي على:

  • وهما رأس بايت (CMF و FLG من RFC 1950) مع القيم 0x78 0x01
    • CM = 8 = تنكمش
    • CINFO = 7 = 32 كيلو بايت نافذة
    • FCHECK = 1 = الاختباري بت هذا الرأس
  • إخراج C# DeflateStream
  • وهو Adler32 الاختباري من إدخال البيانات إلى DeflateStream, big-endian شكل (MSB الأولى)

أدليت به بلدي أدلر تنفيذ

public class Adler32Computer
{
    private int a = 1;
    private int b = 0;

    public int Checksum
    {
        get
        {
            return ((b * 65536) + a);
        }
    }

    private static readonly int Modulus = 65521;

    public void Update(byte[] data, int offset, int length)
    {
        for (int counter = 0; counter < length; ++counter)
        {
            a = (a + (data[offset + counter])) % Modulus;
            b = (b + a) % Modulus;
        }
    }
}

وكان ذلك إلى حد كبير.

لقد استعملت GZipStream ضغط الإخراج من .صافي XmlSerializer وعملت بشكل جيد تماما لضغط النتيجة مع gunzip (في سيغوين), برنامج لضغط الملفات و آخر GZipStream.

للإشارة, هنا هو ما فعلته في التعليمات البرمجية:

FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
using (GZipStream gzStream = new GZipStream(fs, CompressionMode.Compress))
{
  XmlSerializer serializer = new XmlSerializer(typeof(MyDataType));
  serializer.Serialize(gzStream, myData);
}

ثم ضغط في c#

FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
using (Stream input = new GZipStream(fs, CompressionMode.Decompress))
{
   XmlSerializer serializer = new XmlSerializer(typeof(MyDataType));
   myData = (MyDataType) serializer.Deserialize(input);
}

باستخدام " ملف " المساعدة في سيغوين يكشف أن هناك في الواقع فرق بين نفس الملف المضغوط مع GZipStream مع جنو GZip (ربما رأس معلومات الآخرين وقد ذكر في هذا الموضوع).هذا الاختلاف ، ومع ذلك ، يبدو أنه لا يهم في الممارسة العملية.

gzip فرغ + بعض رأس/تذييل الصفحة بيانات ، مثل اختباري و طول ، إلخ.حتى انهم لا تتوافق بمعنى أن أسلوب واحد يمكن استخدام تيار من أخرى ، لكنها تستخدم نفس خوارزمية ضغط.

أنها مجرد ضغط البيانات باستخدام zlib أو تنكمش الخوارزميات ، ولكن لا توفر الناتج عن تنسيق الملف.هذا يعني أنه إذا قمت بتخزين تيار كما هو إلى القرص الصلب على الأرجح أنك لن تكون قادرا على فتحه باستخدام بعض التطبيقات (gzip أو winrar) لأن رؤوس الملف (الرقم السحري ، إلخ ) ليست مدرجة في تيار يجب أن تكتب لهم نفسك.

بدءا من .NET Framework 4.5 System.IO.Compression.DeflateStream فئة يستخدم مكتبة zlib.

من الطبقة المقالة MSDN:

تمثل هذه الفئة فرغ الخوارزمية ، وهو معيار الصناعة خوارزمية ضياع ضغط الملف و الضغط.بدءا .الإطار الصافي 4.5 DeflateStream الدرجة يستخدم مكتبة zlib.ونتيجة لذلك ، فإنه يوفر أفضل خوارزمية ضغط و في معظم الحالات أصغر ملف مضغوط من توفر ذلك في الإصدارات السابقة من .NET Framework.

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

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