كيف يمكن للمرء قراءة البايتات من الملف في بايثون
سؤال
مشابه ل هذا السؤال، أحاول القراءة في رأس علامة ID3v2 وأواجه مشكلة في معرفة كيفية الحصول على وحدات البايت الفردية في بيثون.
قرأت أولاً كل البايتات العشر في سلسلة.أريد بعد ذلك تحليل الأجزاء الفردية من المعلومات.
يمكنني الحصول على رقمين من الأحرف في السلسلة، ولكن بعد ذلك ليس لدي أي فكرة عن كيفية أخذ هذين الحرفين والحصول على عدد صحيح منهما.
يبدو أن حزمة البنية هي ما أريده، لكن لا يمكنني تشغيله.
هذا هو الكود الخاص بي حتى الآن (أنا جديد جدًا على لغة بايثون راجع للشغل... لذا تعامل معي بسهولة):
def __init__(self, ten_byte_string):
self.whole_string = ten_byte_string
self.file_identifier = self.whole_string[:3]
self.major_version = struct.pack('x', self.whole_string[3:4]) #this
self.minor_version = struct.pack('x', self.whole_string[4:5]) # and this
self.flags = self.whole_string[5:6]
self.len = self.whole_string[6:10]
من الواضح أن طباعة أي قيمة باستثناء أمر هراء لأنه لم يتم تنسيقها بشكل صحيح.
المحلول
إذا كان لديك سلسلة تحتوي على 2 بايت وترغب في تفسيرها كعدد صحيح 16 بت، فيمكنك القيام بذلك عن طريق:
>>> s = '\0\x02'
>>> struct.unpack('>H', s)
(2,)
لاحظ أن > مخصص للنهاية الكبيرة (الجزء الأكبر من العدد الصحيح يأتي أولاً).هذا هو التنسيق الذي تستخدمه علامات id3.
بالنسبة للأحجام الأخرى من الأعداد الصحيحة، يمكنك استخدام رموز تنسيق مختلفة.على سبيل المثال."i" لعدد صحيح 32 بت موقّع.راجع المساعدة (الهيكل) للحصول على التفاصيل.
يمكنك أيضًا تفريغ عدة عناصر في وقت واحد.على سبيل المثال، لقطعتين قصيرتين غير موقعتين، متبوعتين بقيمة 32 بت موقعة:
>>> a,b,c = struct.unpack('>HHi', some_string)
من خلال الكود الخاص بك، فإنك تبحث عن (بالترتيب):
- سلسلة من 3 أحرف
- قيمتان بايت مفردة (الإصدار الرئيسي والثانوي)
- متغير أعلام 1 بايت
- كمية بطول 32 بت
سلسلة التنسيق لهذا ستكون:
ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)
نصائح أخرى
أحاول القراءة في رأس علامة ID3v2
FWIW، هناك بالفعل وحدة لهذا.
كنت سأوصي struct
الحزمة ولكن بعد ذلك قلت أنك جربتها.جرب هذا:
self.major_version = struct.unpack('H', self.whole_string[3:5])
ال pack()
تقوم الدالة بتحويل أنواع بيانات بايثون إلى بتات، و unpack()
تقوم الدالة بتحويل البتات إلى أنواع بيانات بايثون.