Я недавно приступил к анализу двоичных данных с помощью Python, но меня смущает то, как "байтовые" элементы обрабатываются Python.Возьмем, к примеру, следующий разговор интерпретатора:
>>> f = open('somefile.gz', 'rb')
>>> f
<open file 'textfile.gz', mode 'rb' at 0xb77f4d88>
>>> bytes = f.read()
>>> bytes[0]
'\x1f'
>>> len(bytes[0])
1
>>> int(bytes[0]) <---- calling __str__ automatically on bytes[0] ?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '\x1f'
В приведенном выше сеансе показано, что размер байта [0] равен 1 байту, а представление __str__
- шестнадцатеричное.Не беспокойтесь, но когда я пытаюсь трактовать байты [0] как один байт, я получаю странное поведение.
Если я хочу проанализировать / интерпретировать двоичный поток на основе некоторой спецификации, где спецификация включает представление в шестнадцатеричном формате, двоичный и десятичный, как бы я поступил так.
Например, будет "первые два байта \xbeef
, следующий - десятичное 8
, за которым следует упакованное битовое поле, где каждый из8 битов байта представляют некоторый флаг? Я полагаю, что есть несколько модулей, облегчающих эту задачу, но я бы хотел сделать это с нуля.
Я видел ссылки на модуль struct
, нонет ли способа проверить байты, прочитанные напрямую, без введения нового модуля? Что-то вроде bytes[0] == 0xbeef
?
Может кто-нибудь помочь мне с тем, как обычно люди анализируют двоичные данные, соответствующие спецификации, используя Python? Спасибо.