Как получить размер кадра в тегах ID3v2.2 MP3?

Я разобрался с тегами ID3v2.3, так как там 4 байта, но тег заголовка фрейма здесь всего 3 байта, а не 4. Похоже, это означает, что я не могу использовать struct.unpack для получения int из этого.

Например, сейчас я работаю с тегом: TT2\x00\x00\x0c\x00Torn Within, где TT2 — идентификатор имени, а \x00\x00\x0c — идентификатор размера. Содержимое тега \x00Torn Within имеет размер 12 байт.

Вот заголовок ID3 песни. 'ID3\x02\x00\x00\x00\x04NP', где видно, что кодировка и флаги не установлены.

Я пробовал struct.unpack('>3b', '\x00\x00\x0c'), но это захватывает только значение каждого отдельного байта.

Но после этого я застрял, потому что, если я не добавлю \x00 к тегу размера, я не смогу продолжить. Что я делаю?

Вот документы по тегам ID3 http://id3.org/id3v2-00 и документы для модуля struct http://docs.python.org/library/struct.html#format-characters

edit обнаружил, что я могу сделать это: int(binascii.hexlify('\x00\x00\x0c'), 16) но я не думаю, что это отличное решение


person TankorSmash    schedule 14.07.2012    source источник
comment
Вы всегда можете добавить \x00 нулевой байт.   -  person Martijn Pieters    schedule 15.07.2012
comment
@MartijnPieters Я думал то же самое, но я не был уверен, окажет ли это какое-либо влияние, если тег когда-либо станет действительно большим, скажем, если он содержит изображение найма или что-то в этом роде. Как вы думаете, это не будет проблемой?   -  person TankorSmash    schedule 15.07.2012
comment
3 байта ограничивают размер поля, ваше нулевое заполнение не изменит этого. 16777216 байт вполне достаточно для тегов MP3.   -  person Martijn Pieters    schedule 15.07.2012


Ответы (1)


Просто добавьте нулевой байт (\x00) перед распаковкой:

>>> length = "\x00\x00\x0c"
>>> struct.unpack('>I', '\x00' + length)
(12,)

Нулевой байт дополняет ваши байты длины до 4 байтов без изменения смысла. Максимальное значение, которое может содержать 3 байта размера, равно 224, что равно 16777216 байтам; добавление заполнения никоим образом не изменит этот предел.

person Martijn Pieters    schedule 14.07.2012