كيف يمكن للمرء قراءة البايتات من الملف في بايثون

StackOverflow https://stackoverflow.com/questions/150532

  •  02-07-2019
  •  | 
  •  

سؤال

مشابه ل هذا السؤال، أحاول القراءة في رأس علامة 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)

نصائح أخرى

لماذا تكتب بنفسك؟(بافتراض أنك لم تقم بمراجعة هذه الخيارات الأخرى.) هناك خياران متاحان لقراءة معلومات علامة ID3 من ملفات MP3 في Python.تحقق من بلدي إجابة في أكثر من هذا سؤال.

أحاول القراءة في رأس علامة ID3v2

FWIW، هناك بالفعل وحدة لهذا.

كنت سأوصي struct الحزمة ولكن بعد ذلك قلت أنك جربتها.جرب هذا:

self.major_version = struct.unpack('H', self.whole_string[3:5])

ال pack() تقوم الدالة بتحويل أنواع بيانات بايثون إلى بتات، و unpack() تقوم الدالة بتحويل البتات إلى أنواع بيانات بايثون.

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