Как читать байты из файла в 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]

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
8
0
7 995
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

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

для 'H' вам нужно использовать 2-байтовый фрагмент.

Brian 30.09.2008 01:00

Вы правы, я это не заметил. Я исправлю свой пример, чтобы он работал, но в любом случае ваш ответ будет лучше.

Greg Hewgill 30.09.2008 02:13
Ответ принят как подходящий

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

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

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

Для других размеров целых чисел вы используете другие коды формата. например. «i» для 32-битного целого числа со знаком. Подробности см. В справке (структура).

Также можно распаковать сразу несколько элементов. например, для 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)

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

Я их видел. Но на самом деле это проект для школы, и мы решили, что напишем собственный парсер.

jjnguy 30.09.2008 00:52

I am trying to read in an ID3v2 tag header

FWIW, для этого есть уже модуль.

Другие вопросы по теме