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

... else:

... 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. Спецификаторы порядка байтов

Спецификатор

Порядок байтов

<