Конвертация чисел в 16-ричную систему счисления в Python
Основные способы перевода чисел в 16-ричную систему
Шестнадцатеричная система широко используется в программировании для компактной записи двоичных данных, цветов, адресов памяти. Рассмотрим несколько подходов к переводу чисел в формат base16 на Python, от встроенных функций до ручной реализации.
Как перевести число в 16-ричный вид с помощью встроенной функции hex()?
Самый простой способ — использовать функцию hex(). Она принимает целое число и возвращает строку вида 0x... с буквами в нижнем регистре.
num = 255
result = hex(num)
print(result) # 0xff
Python восьмеричная система (восьмеричная система счисления в python)
Для целых чисел от 0 до 15 результат будет содержать один шестнадцатеричный разряд:
print(hex(10)) # 0xa
print(hex(16)) # 0x10
перевод в другие системы счисления python (перевод в другую систему счисления в python)
Обратите внимание: hex() всегда добавляет префикс 0x. Если требуется вывод без префикса, используют срез строки: hex(num)[2:].
Как получить 16-ричную строку без префикса и с контролем регистра букв?
Для тонкой настройки форматирования применяют строковый метод format() или f-строки. Спецификатор X даёт заглавные буквы, x — строчные.
num = 255
print(format(num, 'x')) # ff
print(format(num, 'X')) # FF
print(f"{num:x}") # ff
print(f"{num:04X}") # 00FF (с ведущими нулями до 4 символов)
16 система счисления python (перевод в шестнадцатеричную систему в python)
Здесь можно задать минимальную ширину поля и символ заполнения. Это удобно для выравнивания.
Как перевести число в 16-ричную систему вручную (алгоритм деления)?
Если требуется понимание процесса или ограничения на встроенные функции, реализуйте алгоритм последовательного деления на 16 с сохранением остатков.
def to_hex_manual(num):
digits = '0123456789abcdef'
result = ''
if num == 0:
return '0'
while num > 0:
rem = num % 16
result = digits[rem] + result
num //= 16
return result
print(to_hex_manual(255)) # ff
print(to_hex_manual(0)) # 0
Python перевод в двоичную систему (перевод числа в двоичную систему в python)
Вариант для отрицательных чисел потребует дополнительной обработки (например, представление в дополнительном коде).
Как перевести байты или последовательности байт в 16-ричную строку?
Для объектов bytes или bytearray есть встроенный метод hex(), возвращающий объединённую строку без разделителей.
data = b'\x00\x01\x0a\xff'
print(data.hex()) # 00010aff
print(data.hex(' ')) # 00 01 0a ff (с пробелом)
print(data.hex(':', 2)) # 00:01:0a:ff (разделитель каждые 2 байта)
перевод в десятичную систему счисления python (перевод числа в десятичную систему счисления в python)
Альтернатива — binascii.hexlify() из модуля binascii, который также работает с байтами и позволяет настраивать разделитель.
import binascii
print(binascii.hexlify(b'abc')) # b'616263'
перевод в троичную систему python (перевод числа в троичную систему в python)
Как перевести число с плавающей точкой в 16-ричный формат?
Вещественные числа имеют собственный метод hex(), который возвращает строку, представляющую внутреннее двоичное представление в шестнадцатеричном виде.
num = 3.141592653589793
print(num.hex()) # 0x1.921fb54442d18p+1
Эта запись содержит мантиссу в hex и степень двойки (p). Обратное преобразование — метод класса float.fromhex().
Какие типичные ошибки возникают при переводе и как их избежать?
- Ошибка TypeError при передаче нецелого числа в hex(). Функция принимает только объекты int.
- Забыли про префикс 0x. Если его нужно убрать, всегда используйте срез строки или форматирование.
- Регистр букв. Функция hex() возвращает строчные буквы. Для верхнего регистра применяйте format(num, 'X').
- Работа с отрицательными числами. hex(-255) вернёт -0xff, что не является общепринятым беззнаковым представлением. Для получения дополнительного кода используйте: hex(num & 0xFFFFFFFF) (для 32-битного маскирования).
- Путаница между строкой и числом. Функция hex() возвращает строку, а не число.
Расширенные примеры перевода в шестнадцатеричную систему
1. Кастомный алфавит для 16-ричной системы
При замене стандартных цифр на произвольные символы (например, для обфускации) можно адаптировать алгоритм деления.
def to_hex_custom(num, alphabet='zyxwvutsrqponmlkjihgfedcba9876543210'):
base = len(alphabet) # 16
if base != 16:
raise ValueError('Alphabet length must be 16')
if num == 0:
return alphabet[0]
result = ''
while num > 0:
result = alphabet[num % base] + result
num //= base
return result
print(to_hex_custom(255)) # 'po' (alphabet начинается с z, p=16, o=15? нужно проверить)
# На практике алфавит выбирается так, чтобы символы не повторялись
Результат:
# Пример: alphabet = '0123456789abcdef' -> 'ff' # Для 'zyxwvutsrqponmlkjihgfedcba9876543210' число 255 даст другой результат.
2. Перевод больших чисел с произвольной точностью (библиотека decimal)
Для целых чисел произвольной длины hex() работает корректно. Но если нужно работать с дробями или высокой точностью, используют модуль decimal и ручной перевод.
from decimal import Decimal, getcontext
def decimal_to_hex(d):
"""Перевод Decimal в 16-ричную строку (целая часть)"""
integer_part = int(d)
return hex(integer_part)
# Пример с очень большим числом
getcontext().prec = 100
big = Decimal('123456789012345678901234567890')
print(decimal_to_hex(big))
Результат:
0x18ee90ff6c373e0ee4e3f0ad2
3. Обратный перевод: из 16-ричной строки в целое число
Функция int() с указанием основания 16 преобразует строку обратно.
print(int('ff', 16)) # 255
print(int('0xFF', 16)) # 255 (префикс игнорируется)
print(int('deadbeef', 16)) # 3735928559
Для строк с ведущими нулями:
print(int('0001', 16)) # 1
4. Форматированный hex-дамп (представление с разделителями и адресами)
Используя генерацию строк, можно создать дамп, похожий на вывод hexdump.
def hex_dump(data):
"""data: bytes, возвращает строку с адресами и hex-представлением"""
result = []
for i in range(0, len(data), 16):
chunk = data[i:i+16]
hex_part = ' '.join(f'{b:02x}' for b in chunk)
ascii_part = ''.join(chr(b) if 32 <= b < 127 else '.' for b in chunk)
result.append(f'{i:08x} {hex_part:<48} {ascii_part}')
return '\n'.join(result)
sample = b'Hello, World!\x00\x01\x02'
print(hex_dump(sample))
Результат:
00000000 48656c6c6f2c20576f726c6421000102 Hello, World!....
5. Перевод отрицательных чисел в беззнаковое представление (дополнительный код)
Для симуляции беззнакового 32-битного или 64-битного представления выполняется логическое И с маской.
def to_hex_unsigned(num, bits=32):
mask = (1 << bits) - 1
return hex(num & mask)
print(to_hex_unsigned(-1, 32)) # 0xffffffff
print(to_hex_unsigned(-255, 16)) # 0xff01
print(to_hex_unsigned(0x7fffffff, 32))# 0x7fffffff
Результат всегда без знака и с длиной, соответствующей выбранной разрядности.
6. Перевод в 16-ричную систему с помощью struct.pack для многобайтовых значений
Модуль struct упаковывает числа в байты с заданным порядком байт, которые затем можно представить в hex.
import struct
num = 0x12345678
packed = struct.pack('>I', num) # big-endian 4 байта
print(packed.hex()) # 12345678
print(packed.hex(':')) # 12:34:56:78
Для little-endian используйте '<I'.
packed_le = struct.pack('
7. Перевод с использованием модуля ctypes для прямого доступа к памяти
Для экспертных сценариев можно получить внутреннее представление числа через ctypes.
import ctypes
num = 3.14
# Получаем 8 байт double
bytes_val = ctypes.c_double(num)
print(bytes(bytes_val).hex()) # 40091eb851eb851f (little-endian на x86)
Этот способ демонстрирует точное внутреннее представление чисел с плавающей точкой.