Python Programming

تحويل الأعداد الصحيحة إلى بايت بكفاءة في بايثون

Spread the love

تحويل الأعداد الصحيحة إلى تمثيلها البايتى مهمة متكررة في البرمجة، خاصة عند العمل مع البيانات الثنائية، أو الاتصال الشبكي، أو إدخال/إخراج الملفات. يقدم بايثون 2 وبايثون 3 نهجًا مختلفًا، مما قد يتسبب في مشاكل في قابلية النقل إذا لم تتم معالجته بشكل صحيح. تستعرض هذه المقالة طرقًا مختلفة، مع التركيز على التوافق والأداء.

جدول المحتويات

تحويل الأعداد الصحيحة إلى بايت متوافق بين الإصدارات

الطريقة الأكثر موثوقية لتحويل الأعداد الصحيحة إلى بايت مع الحفاظ على التوافق بين بايثون 2.7 وبايثون 3 هي استخدام وحدة struct. توفر هذه الوحدة وظائف لتعبئة البيانات وفك ضغطها بتنسيقات مختلفة.

import struct

def int_to_bytes(integer, num_bytes):
  """يحول عددًا صحيحًا إلى بايت، متوافق مع بايثون 2.7 و 3.

  Args:
    integer: العدد الصحيح المراد تحويله.
    num_bytes: عدد البايت المطلوب.

  Returns:
    كائن بايت يمثل العدد الصحيح. يثير ValueError إذا كان العدد الصحيح
    كبيرًا جدًا بالنسبة لعدد البايت المحدد.
  """
  try:
    return struct.pack(">I", integer)[:num_bytes]  # '>I' لعدد صحيح بدون إشارة بنظام الترقيم الكبير
  except struct.error:
    raise ValueError(f"العدد الصحيح كبير جدًا بالنسبة لـ {num_bytes} بايت")

# مثال على الاستخدام
my_int = 12345
bytes_representation = int_to_bytes(my_int, 4)  # 4 بايت لعدد صحيح 32 بت
print(bytes_representation)

my_large_int = 0xFFFFFFFF  # الحد الأقصى للعدد الصحيح بدون إشارة 32 بت
bytes_representation = int_to_bytes(my_large_int, 4)
print(bytes_representation)

# مثال على معالجة الأخطاء
try:
    bytes_representation = int_to_bytes(my_large_int + 1, 4)
except ValueError as e:
    print("خطأ:", e)

struct.pack(">I", integer) يعّبّئ العدد الصحيح كعدد صحيح بدون إشارة بنظام الترقيم الكبير. يسمح لك جزء [:num_bytes] بتحديد طول المخرجات، مع مراعاة الأعداد الصحيحة التي قد تتناسب مع عدد أقل من البايت. يعالج كتلة try-except الأعداد الصحيحة التي تتجاوز سعة البايت المحددة. قم بتعديل سلسلة التنسيق (مثل، >i لعدد صحيح ذي إشارة، >Q لعدد صحيح بدون إشارة 64 بت) حسب الحاجة.

طرق تحويل الأعداد الصحيحة إلى بايت خاصة ببايثون 3

يوفر بايثون 3 طريقة int.to_bytes() الأكثر مباشرة. إنها فعّالة وموجزة ولكنها تفتقر إلى دعم بايثون 2.

my_int = 12345

# تحويل إلى بايت، مع تحديد ترتيب البايت (نظام الترقيم الكبير) وعدد البايت
bytes_representation = my_int.to_bytes(4, byteorder='big')  # مثال مع 4 بايت
print(bytes_representation)

# تحويل إلى بايت، مع تحديد عدد البايت تلقائيًا
bytes_representation = my_int.to_bytes((my_int.bit_length() + 7) // 8, byteorder='big')
print(bytes_representation)

يحدد byteorder ترتيب البايت (‘big’ لنظام الترقيم الكبير، ‘little’ لنظام الترقيم الصغير). يُحسب المثال الثاني الحد الأدنى من البايت المطلوبة تلقائيًا.

مقارنة الأداء

يكون الفرق في الأداء بين طريقة struct و int.to_bytes() في بايثون 3 ضئيلاً عادةً. بالنسبة للكود الحساس للغاية للأداء مع العديد من التحويلات، قد يُظهر قياس الأداء ميزة طفيفة لـ int.to_bytes(). ومع ذلك، فإن توافق طريقة struct بين الإصدارات أمر بالغ الأهمية. بالنسبة لمعظم السيناريوهات، تفوق قابلية قراءة ووضوح int.to_bytes() أي مكاسب طفيفة في الأداء من struct في بايثون 3. إذا كان التوافق مع بايثون 2.7 ضروريًا، فإن نهج struct هو الخيار الوحيد الممكن.

باختصار، أعط الأولوية لطريقة struct لتحقيق أقصى قدر من التوافق. استخدم int.to_bytes() في بايثون 3 لحل أكثر إيجازًا وأسرع قليلًا إذا لم يكن التوافق مع بايثون 2 مطلوبًا. تأكد دائمًا من تضمين معالجة قوية للأخطاء لمنع المشاكل المتعلقة بالأعداد الصحيحة الكبيرة أو مخازن البايت غير الكافية.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *