Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 151

форматы файлов или сетевых пакетов, чтобы извлечь или даже изменить данные.

В этом разделе я покажу вам основы работы с бинарными данными в 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 байт на строку):