سؤال

أنا أكتب أخرق التنفيذ في بيثون كممارسة تعليمية. لقد وصلت إلى نقطة كتابة رموز Huffman طول المتغير إلى المخزن المؤقت (أو ملف). فقط للعثور على عدم وجود فئة bitstream تنفذها بيثون! لقد ألقيت نظرة على مجموعة مصفوفة و بنية الوحدات ولكن لا يبدو أنها لا تفعل ما أحتاج إليه دون عمل إضافي.

تحول قليلا من النعاج هذه تنفيذ Bitstream، وهو أكثر مثل ما أريده. هل هناك حقا فئة Bitstream قابلة للمقارنة في مكتبة بيثون القياسية؟

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

المحلول

أنت على حق أن لا يوجد شيء في المكتبة القياسية، ولكن هل جربت بيتسترنج وحدة؟ انها مصممة جدا لهذا النوع من التطبيقات، مستقرة وثق بشكل جيد, أعتقد أنه يجب أن يناسب احتياجاتك.

يتم البناء والقراءة والتقطيع وما إلى ذلك. لقد رأيت أمثلة الترميز هوفمان تتم معها بنجاح في الماضي.

خيار آخر جيد هو bitarray, ، والتي لا تملك العديد من الميزات ولكن يمكن أن تكون أسرع بكثير كما هو ملحق C. ككافأة لها مثال ترميز Huffman موزعة كجزء من حزمة المصدر.

نصائح أخرى

صيح. تتم كتابة معظم الوحدات النمطية الموجودة في Stdlib التي تحتاج إلى bitstreaming في ج، مع التفاصيل المخفية بعيدا.

لا، بقدر ما أعرف أنه لا يوجد شيء في المكتبة القياسية التي تساعدك في عمليات محاذاة بعض الشيء. Python غير مصمم للكمال مع الأشياء الصغيرة ^^ ...

ولكن يمكنك بسهولة كتابة كاتب البيتستريم الخاص بك بمساعدة صفيفات البايت:

>>> from array import array
>>> a = array("B")
>>> a.append(1) # 128
>>> a.append(0)
>>> a.append(0)
>>> a.append(0)
>>> a.append(1) # 8
>>> a.append(1) # 4
>>> a.append(1) # 2
>>> a.append(1) # 1
>>> print reduce(lambda m, n: (m << 1) + n, a, 0)
143

انت وجدت الفكرة...

ربما أكون متأخرا قليلا إلى الحفلة، ولكن هناك مكتبة البيتستريم:

https://pypi.python.org/pypi/bitstream/2.0.3.

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