В этом разделе я покажу вам основы работы с бинарными данными в Python.
bytes и bytearray
В Python 3 появились следующие последовательности восьмибитных целых чисел,
имеющих возможные значения от 0 до 255. Они могут быть двух типов:
bytes неизменяем, как кортеж байтов;
bytearray изменяем, как список байтов.
Начнем мы с создания списка с именем blist и в следующем примере созда-
дим переменную типа bytes с именем the_bytes и переменную bytearray с име-
нем the_byte_array:
>> blist = [1, 2, 3, 255]
>>> the_bytes = bytes(blist)
>>> the_bytes
b'\x01\x02\x03\xff'
>>> the_byte_array = bytearray(blist)
>>> the_byte_array
bytearray(b'\x01\x02\x03\xff')
Представление значения типа bytes начинается с символа b и кавычки, за которыми следу-
ют шестнадцатеричные последовательности вроде \x02 или символы ASCII, заканчивается
конструкция соответствующим символом кавычки. Python преобразует шестнадцатеричные
последовательности или символы ASCII в маленькие целые числа, но показывает байтовые
значения, которые корректно записаны с точки зрения кодировки ASCII:
>>> b'\x61'
b'a'
>>> b'\x01abc\xff'
b'\x01abc\xff'
В следующем примере показано, что вы не можете изменить переменную типа bytes:
>>> the_bytes[1] = 127
Traceback (most recent call last):
Бинарные данные
201
File "<stdin>", line 1, in <module>
TypeError: 'bytes' object does not support item assignment
Но переменная типа bytearray слишком мягкая и легко изменяемая:
>>> the_byte_array = bytearray(blist)
>>> the_byte_array
bytearray(b'\x01\x02\x03\xff')
>>> the_byte_array[1] = 127
>>> the_byte_array
bytearray(b'\x01\x7f\x03\xff')
Каждая из этих переменных может содержать результат, состоящий из 256 элемен-
тов, имеющих значения от 0 до 255:
>>> the_bytes = bytes(range(0, 256))
>>> the_byte_array = bytearray(range(0, 256))
При выводе на экран содержимого переменных типа bytes или bytearray Python
использует формат \x xx для непечатаемых байтов и их эквиваленты ASCII для
печатаемых (плюс некоторых распространенных управляющих последователь-
ностей вроде \n вместо \x0a). Так выглядит на экране представление значения пере-
менной the_bytes (переформатированное вручную для того, чтобы показать по
16 байт на строку):