Вспомним основы информатики и поговорим о системах исчисления. В жизни мы привыкли к десятичной системе (base-10 или decimal), железо компьютеров оперирует в системе двоичной (base-2 или binary) – нулями и единицами. Часто приходится иметь дело с системой шестнадцатиричной (base-16 или hexadecimal), она позволяет записывать данные в 8 раз короче, чем двоичная. Реже встречается система восьмеричная (base-8 или octal). Система исчисления – это всего лишь средство представления числа, т.е. то, как мы его в строчку запишем или считаем, само число остается самим собой, независимо от системы.
Чтобы получить целое число из строки, записанной в какой-то системе исчисления, используем функцию int (второй параметр – база системы):
>>> int('42') # по умолчанию 10 42 >>> int('42', 10) # тоже самое 42 >>> int('101010', 2) 42 >>> int('BEEF', 16) 48879 >>> int('7654', 8) 4012
Наоборот сделать из числа строку в какой-то системе – встроенные функции bin, oct и hex:
>>> bin(42) '0b101010' >>> hex(48879) '0xbeef' >>> oct(4012) '0o7654'
В строке появились префиксы 0b
, 0x
и 0o
. Как и в Си, в Python можно использовать эти префиксы для записи чисел в коде помимо обычного десятичного варианта, если это требуется:
>>> 0b11011, 0xDEAD, 0o777 (27, 57005, 511)
Однако, часто приходится иметь дело с чистыми HEX-данными без префиксов. Многие (да и я) делали вот так:
>>> hex(12345)[2:] '3039'
Т.е. просто отрезали первые два символа. Это не очень интуитивно, да и может привести к неправильному поведению, если передать отрицательное число:
>>> hex(-12345) '-0x3039' >>> hex(-12345)[2:] 'x3039'
К счастью, есть встроенная функция format(value, format_spec) (не путать с str.format
), которая форматирует значение, согласно спецификатору форматирования:
>>> format(3039, 'x'), format(3039, 'X'), format(3039, '#x') ('bdf', 'BDF', '0xbdf') >>> format(120, 'b') '1111000' >>> format(79, 'o') '117'
x
— 16-ричное без префикса, маленькие буквX
— 16-ричное без префикса, заглавные буквы#x
— 16-ричное с префиксом, маленькие буквыb
— двоичное число без префикса и т.д.
format(value, format_spec)
эквивалентная вызову type(value).__format__(value, format_spec)
.
🐉 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈