Простой Python. Современный стиль программирования (Любанович) - страница 115

Стандартный модуль binascii содержит функции, которые позволяют вам конвертировать данные в бинарный вид и в различные представления строк: шестнадцатеричное (с основанием 16), с основанием 64, uuencoded и др. Например, в следующем сниппете выведем на экран восьмибайтовый заголовок PNG как последовательность шестнадцатеричных значений вместо смеси символов ASCII и управляющих последовательностей вида \x xx, которые Python использует для отображения байтовых переменных:

>>>> import binascii

>>>> valid_png_header = b'\x89PNG\r\n\x1a\n'

>>>> print(binascii.hexlify(valid_png_header))

>b'89504e470d0a1a0a'

В другую сторону это тоже работает:

>>>> print(binascii.unhexlify(b'89504e470d0a1a0a'))

>b'\x89PNG\r\n\x1a\n'

Битовые операторы

Python предоставляет целочисленные операторы, работающие на уровне битов, их аналоги имеются в языке С. В табл. 7.7 показаны они все, а также примеры их использования для целых чисел a (в десятичной системе счисления 5, в двоичной — 0b0101) и b (в десятичной системе счисления 1, в двоичной — 0b0001).


Таблица 7.7. Целочисленные операции для уровня битов
ОператорОписаниеПримерДесятичный результатДвоичный результат
&Логическое Иa & b10b0001
|Логическое ИЛИa | b50b0101
^Исключающее ИЛИa ^ b40b0100
~Инверсия битов— a— 6Двоичное представление зависит от размера типа int
<<Сдвиг влевоa << 1100b1010
>>Сдвиг вправоa << 120b0010

Эти операторы похожи на операторы для работы с множествами, показанные в главе 3. Оператор & возвращает биты, которые одинаковы в обоих аргументах, а оператор | возвращает биты, которые установлены в обоих аргументах. Оператор ^ возвращает биты, которые установлены в одном или в другом аргументе, но не в них обоих. Оператор ~ обращает порядок байтов в одном аргументе, он также изменяет знак, поскольку старший бит целого числа указывает на его знак (1 означает «минус») в арифметике дополнительных кодов, которая используется во всех современных компьютерах. Операторы << и >> просто смещают биты влево или вправо. Сдвиг влево на один бит аналогичен умножению на 2, а сдвиг вправо — делению на 2.

Упражнения

1. Создайте строку Unicode с именем mystery и присвойте ей значение '\U0001f4a9'. Выведите на экран значение строки mystery. Найдите имя Unicode для mystery.

2. Закодируйте строку mystery, в этот раз с использованием кодировки UTF-8, в переменную типа bytes с именем pop_bytes. Выведите на экран значение переменной pop_bytes.

3. Используя кодировку UTF-8, декодируйте переменную pop_bytes в строку pop_string. Выведите на экран значение переменной pop_string. Равно ли оно значению переменной mystery?