تختلف معالجة بايتات بايثون اختلافًا كبيرًا بين بايثون 2.7 و بايثون 3. توضح هذه المقالة كيفية تحويل البايتات إلى أعداد صحيحة في كلا الإصدارين، مع التركيز على الفروقات المهمة.
محتويات
- بايثون 2.7 وسلاسل البايت
- تحويل البايتات إلى أعداد صحيحة في بايثون 2.7
- بايثون 3 ونوع
bytes
- تحويل البايتات إلى أعداد صحيحة في بايثون 3
بايثون 2.7 وسلاسل البايت
في بايثون 2.7، يعالج نوع str
كل من بيانات النص وبيانات البايت. نوع bytes
المخصص، كما هو موجود في بايثون 3، غير موجود. سلاسل البايت هي في الأساس تسلسلات من الأحرف التي تمثل قيم البايت. من المهم أن نتذكر أن بايثون 2.7 قد تم إهماله رسميًا ويجب عدم استخدامه للمشاريع الجديدة.
تحويل البايتات إلى أعداد صحيحة في بايثون 2.7
يتم تحويل البايتات المفردة إلى أعداد صحيحة باستخدام دالة ord()
:
byte_string = 'A' # يمثل قيمة البايت لـ 'A'
integer_value = ord(byte_string)
print(integer_value) # الإخراج: 65
توفر ord()
نقطة رمز Unicode، والتي تتطابق مع القيمة العددية للبايت للبايتات المفردة. بالنسبة لسلاسل البايت الأطول، من الضروري إجراء معالجة البت لتحويلها إلى أعداد صحيحة أكبر. يفترض المثال التالي ترتيب البايت little-endian:
byte_string = 'x01x02x03' # مثال لسلسلة بايت (little-endian)
integer_value = 0
for byte in byte_string:
integer_value = (integer_value << 8) | ord(byte)
print(integer_value) # الإخراج: 66051
يقوم هذا بالتبديل المتكرر للعدد الصحيح يسارًا بمقدار 8 بت ويطبق عملية OR المنطقية لإدراج كل بايت. بالنسبة لترتيب big-endian، قم بعكس التكرار.
بايثون 3 ونوع bytes
يقدم بايثون 3 صراحةً نوع bytes
، ويفصله عن نوع str
(نص Unicode). كائنات bytes
هي تسلسلات ثابتة من الأعداد الصحيحة تتراوح من 0 إلى 255.
تحويل البايتات إلى أعداد صحيحة في بايثون 3
يقدم بايثون 3 نهجًا أنظف. بالنسبة للبايت الواحد:
byte_data = b'x41' # لاحظ بادئة 'b' التي تشير إلى حرفي البايت
integer_value = byte_data[0]
print(integer_value) # الإخراج: 65
يؤدي الوصول المباشر إلى البايت في الفهرس 0 إلى إنتاج القيمة الصحيحة. بالنسبة للعديد من البايتات، يتم استخدام int.from_bytes()
، مع تحديد ترتيب البايت (endianness):
byte_data = b'x01x02x03' # مثال little-endian
integer_value = int.from_bytes(byte_data, byteorder='little')
print(integer_value) # الإخراج: 66051
byte_data = b'x01x02x03' # مثال big-endian
integer_value = int.from_bytes(byte_data, byteorder='big')
print(integer_value) # الإخراج: 16909060
يشير byteorder='little'
إلى أقل بايت أهمية أولاً، بينما يشير byteorder='big'
إلى أكثر بايت أهمية أولاً. حدد دائمًا byteorder
من أجل قابلية النقل؛ خلاف ذلك، يتم استخدام الإعداد الافتراضي للنظام.