Подобно вопросу это, я пытаюсь прочитать заголовок тега ID3v2, и мне сложно понять, как получить отдельные байты в python.
Сначала я прочитал все десять байтов в строку. Затем я хочу проанализировать отдельные фрагменты информации.
Я могу взять два символа номера версии в строке, но тогда я понятия не имею, как взять эти два символа и получить из них целое число.
Кажется, что пакет struct - это то, что я хочу, но я не могу заставить его работать.
Вот мой код на данный момент (я очень новичок в python, кстати ... так что успокойтесь):
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]
Распечатка любого значения, за исключением, очевидно, чушь, потому что они неправильно отформатированы.






Я собирался порекомендовать пакет struct, но потом вы сказали, что пробовали его. Попробуй это:
self.major_version = struct.unpack('H', self.whole_string[3:5])
Функция pack() преобразует типы данных Python в биты, а функция unpack() преобразует биты в типы данных Python.
Вы правы, я это не заметил. Я исправлю свой пример, чтобы он работал, но в любом случае ваш ответ будет лучше.
Если у вас есть строка с 2 байтами, которую вы хотите интерпретировать как 16-битное целое число, вы можете сделать это следующим образом:
>>> s = '\0\x02'
>>> struct.unpack('>H', s)
(2,)
Обратите внимание, что> используется для прямого порядка байтов (сначала идет большая часть целого числа). Это формат, в котором используются теги id3.
Для других размеров целых чисел вы используете другие коды формата. например. «i» для 32-битного целого числа со знаком. Подробности см. В справке (структура).
Также можно распаковать сразу несколько элементов. например, для 2 коротких замыканий без знака, за которыми следует 32-битное значение со знаком:
>>> a,b,c = struct.unpack('>HHi', some_string)
Следуя своему коду, вы ищете (по порядку):
Строка формата для этого будет:
ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)
Зачем писать свои собственные? (Предполагая, что вы не проверяли эти другие варианты.) Есть несколько вариантов для чтения информации тегов ID3 из MP3 в Python. Посмотрите мой отвечать на вопрос это.
Я их видел. Но на самом деле это проект для школы, и мы решили, что напишем собственный парсер.
I am trying to read in an ID3v2 tag header
FWIW, для этого есть уже модуль.
для 'H' вам нужно использовать 2-байтовый фрагмент.