Стандартный модуль 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 & b | 1 | 0b0001 |
| | Логическое ИЛИ | a | b | 5 | 0b0101 |
^ | Исключающее ИЛИ | a ^ b | 4 | 0b0100 |
~ | Инверсия битов | — a | — 6 | Двоичное представление зависит от размера типа int |
<< | Сдвиг влево | a << 1 | 10 | 0b1010 |
>> | Сдвиг вправо | a << 1 | 2 | 0b0010 |
Эти операторы похожи на операторы для работы с множествами, показанные в главе 3. Оператор & возвращает биты, которые одинаковы в обоих аргументах, а оператор | возвращает биты, которые установлены в обоих аргументах. Оператор ^ возвращает биты, которые установлены в одном или в другом аргументе, но не в них обоих. Оператор ~ обращает порядок байтов в одном аргументе, он также изменяет знак, поскольку старший бит целого числа указывает на его знак (1 означает «минус») в арифметике дополнительных кодов, которая используется во всех современных компьютерах. Операторы << и >> просто смещают биты влево или вправо. Сдвиг влево на один бит аналогичен умножению на 2, а сдвиг вправо — делению на 2.