Конвертация чисел в 16-ричную систему счисления в Python

Раздел: Основы 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)

Этот способ демонстрирует точное внутреннее представление чисел с плавающей точкой.

Перевод в шестнадцатеричную систему в Python - comments

En
16 система счисления python (python)