Как читать байты из файла в Python

Похожий наэтот Вопрос, я пытаюсь прочитать в заголовке тега 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]

Распечатка любого значения, за исключением, очевидно, дерьмо, потому что они не отформатированы правильно.

Ответы на вопрос(4)

Решение Вопроса

которую вы хотите интерпретировать как 16-битное целое число, вы можете сделать это:

>>> s = '\0\x02'
>>> struct.unpack('>H', s)
(2,)

Обратите внимание, что> предназначен для big-endian (наибольшая часть целого числа стоит первой). Это формат использования тегов id3.

Для других целочисленных размеров вы используете коды другого формата. например. "я" для 32-разрядного целого числа со знаком. Смотрите help (struct) для деталей.

Вы также можете распаковать несколько элементов одновременно. например, для 2 беззнаковых шорт, за которыми следует 32-битное значение со знаком:

>>> a,b,c = struct.unpack('>HHi', some_string)

Судя по вашему коду, вы ищете (по порядку):

строка из 3 символов2 однобайтовых значения (основная и вспомогательная версия)1-байтовая переменная флагов32-битная длина

Строка формата для этого будет:

ident, major, minor, flags, len = struct.unpack('>3sBBBI', ten_byte_string)

FWIW, естьуже модуль за это.

что у вас нетпроверил эти другие варианты.)Есть несколько вариантов чтения информации тега ID3 из MP3 в Python. Проверьте мойответ вэтот вопрос.

 jjnguy29 сент. 2008 г., 22:52
Я видел их. Но это на самом деле для школьного проекта, и мы решили, что напишем собственный парсер.

Я собирался рекомендоватьstruct пакет, но потом вы сказали, что попробовали это. Попробуй это:

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

pack() функция переписывает типы данных Python в биты, аunpack() Функция преобразует биты в типы данных Python.

 Greg Hewgill30 сент. 2008 г., 00:13
Вы'Я не заметил этого. Я'Я исправлю мой пример, чтобы он работал, но в любом случае ваш - лучший ответ.
 Brian29 сент. 2008 г., 23:00
для ч', вы'Вам нужно будет использовать 2-байтовый фрагмент.

Ваш ответ на вопрос