packbits تجمع البتات في بايتات وتكمل النهاية بأصفار. [1] مثال مؤلف.
ثبت ترتيب الخانات
خيارا bitorder هما big وlittle؛ الافتراضي big. الحشو صفري في نهاية المدخل. [1]
نثبت هنا قائمة واحدة من الصفر والواحد، ونكتبها بترتيب ورود عناصرها من اليسار إلى اليمين: 1،0،1،1،0،0،1،0،1،1. لا نعكس هذا الترتيب بسبب اتجاه النص العربي.
في حسابنا نمنح مواضع المجموعة الثمانية أوزان 128،64،32،16،8،4،2،1 عند big، و1،2،4،8،16،32،64،128 عند little. [1]
نكتب اسم الترتيب بجوار كل نتيجة. المثال يسأل عن بتات هذه القائمة داخل كل بايت، ولا يحدد ترتيب بايتات عدد متعدد البايتات في ملف أو بروتوكول.
احسب البايتين
نقسم تسلسلنا إلى المجموعة 10110010، ثم المجموعة 11. نكمل الثانية إلى ثماني خانات في دفتر الحساب: 11000000. أصبحت لدينا ست خانات إضافية، مع بقاء البتات العشر الأصلية في أول القائمة.
عند big، المجموعة الأولى تعطي 128+32+16+2=178. والثانية تعطي 128+64=192. إذن زوجنا المحسوب هو [178,192]. لا نقرأ 1011001011 بوصفه عددًا واحدًا ثم نقسم قيمته العشرية.
عند little نستخدم أوزانًا صاعدة للمجموعة كما وردت: الأولى 1+4+8+64=77؛ والثانية 1+2=3. لذلك يصبح الزوج [77,3].
كتابة العدد 3 بالثنائي المعتاد تعطي 00000011. أما بتاته في ترتيب little فتقرأ 11000000؛ هنا يظهر الواحدان الأصليان قبل ستة أصفار الحشو. احتفظ باتفاق القراءة بدل الاعتماد على شكل العدد الثنائي وحده.
احتفظ بالطول عند الفك
count=None يفك جميع البتات؛ عدد غير سالب في count يحدد طول الفك. [2]
بايتانا يحملان 16 موضعًا في نموذجنا. عند فك [178,192] بترتيب big، نقرأ 10110010 ثم 11000000؛ أول عشر خانات تعيد 1011001011، والباقي ستة أصفار. طلب count=10 يحتفظ بالمقدمة الأصلية.
أما فك الزوج نفسه بترتيب little فيعطي أول عشر خانات 0100110100 في حسابنا، فلا يعود المدخل الأصلي. تقصير الناتج وحده لا يعوض اختيار ترتيب مختلف.
لا تحذف كل أصفار النهاية لتخمن الطول. تسلسلنا ذو العشر خانات والتسلسل 10110010110 ذو الإحدى عشرة خانة ينتجان [178,192] عند big؛ في الثاني صار أحد الأصفار عنصرًا أصليًا. البايتان وحدهما لا يميزان هذين الاحتمالين.
في ورقة المثال نحفظ ثلاثة حقول: الزوج المحسوب، والترتيب big، والطول 10. هذه بطاقة تعليمية من اختيارنا؛ لا نزعم أن دالة التجميع تخزن الطول تلقائيًا داخل البايتين.

افحص الرجوع وحدود المثال
عددنا كل تسلسلات الصفر والواحد ذات الأطوال 0 إلى 12: مجموع 2^0+2^1+…+2^12 يساوي 8,191 تسلسلًا. القائمة الفارغة واحدة من الحالات؛ لا تحتاج في نموذجنا بايت حشو مستقلًا.
لكل تسلسل ولكل ترتيب أجرينا ستة فحوص: جمع الأوزان مقابل بناء سلسلة ثنائية وتحويلها إلى عدد، وعدد البايتات، ومجالها من 0 إلى 255، واستعادة المقدمة الأصلية، وصفريّة الحشو، وطول الفك الكامل.
إذن 8,191×2×6=98,292 فحصًا، ومع ستة فحوص مباشرة للأزواج والطول والترتيب المخالف صار الإجمالي 98,298. الفحوص مرت على النموذجين الحسابيين؛ ليست نتيجة تشغيل packbits أو unpackbits.
اقتصرنا على بعد واحد ومدخلات صفرية وواحدية. لم نفحص count السالب أو الأكبر من المتاح، ولا بيانات غير ثنائية أو محاور متعددة. وعدد البايتات المحسوب هنا لا يمثل ذاكرة كائن برمجي كاملة أو حجم ملف، ولم نقس سرعة أو نسبة ضغط.
| ترتيب المثال | البايت الأول | البايت الثاني | الطول المحفوظ |
|---|---|---|---|
| big | 178 | 192 | 10 |
| little | 77 | 3 | 10 |
للتوسع: الجمع والطرح في النظام الثنائي.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
