... print('Not a valid PNG')
...
Valid PNG, width 154 height 141
Бинарные данные
203
Этот код делает следующее.
Переменная data содержит первые 30 байт файла PNG. Для того чтобы раз-
местить ее на странице, я объединил две байтовые строки с помощью опера-
торов + и \.
Переменная valid_png_header содержит восьмибайтовую последовательность,
которая обозначает начало корректного PNG-файла.
Значение переменной width извлекается из 16–20-го байтов, а переменной
height — из байтов 21–24.
>LL — это строка формата, которая указывает функции unpack(), как интерпре-
тировать входные последовательности байтов и преобразовать их в типы данных
Python. Рассмотрим ее детальнее:
символ < означает, что целые числа хранятся в формате big-endian (обратный
порядок байтов);
каждый символ L определяет четырехбайтное целое число типа unsigned long.
Вы можете проверить значение каждого четырехбайтного набора непосред-
ственно:
>>> data[16:20]
b'\x00\x00\x00\x9a'
>>> data[20:24]0x9a
b'\x00\x00\x00\x8d'
У целых чисел с обратным порядком байтов главный байт располагается
слева. Поскольку значения ширины и длины меньше 255, они умещаются в по-
следний байт каждой последовательности. Вы можете убедиться в том, что эти
шестнадцатеричные значения соответствуют ожидаемым десятичным значе-
ниям:
>>> 0x9a
154
>>> 0x8d
141
Если вы хотите отправить их в противоположном направлении и преобразовать
данные Python в байты, используйте функцию pack() модуля struct:
>>> import struct
>>> struct.pack('>L', 154)
b'\x00\x00\x00\x9a'
>>> struct.pack('>L', 141)
b'\x00\x00\x00\x8d'
В табл. 7.5 и 7.6 показаны спецификаторы формата для функций pack() и unpack().
Спецификаторы порядка байтов располагаются первыми в строке формата.
204
Глава 7. Работаем с данными профессионально
Таблица 7.5. Спецификаторы порядка байтов
Спецификатор
Порядок байтов
<