Почему bytes(n) в Python создаёт строку нулевых байтов?

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Функция bytes(n) создаёт объект bytes содержащий n нулевых байтов, а не переводит n в бинарный код. Если необходимо получить бинарное представление числа, используйте bin(n)[2:], обрезая префикс '0b'. n.to_bytes(length, 'little') преобразует n в объект типа bytes, где length — это минимально необходимое количество байт для размещения n.

Python
Скопировать код
binary_n = bin(n)[2:]     # '101' для n=5, наглядный бинарный код
bytes_n = n.to_bytes(1, 'little')  # b'\x05', представление числа в виде байта
Python
Скопировать код
n = 5
print(binary_n)   # Вывод: '101', ясное и краткое
print(bytes_n)    # Вывод: b'\x05', компактно и точно
Кинга Идем в IT: пошаговый план для смены профессии

Преобразование int в байты: погружение в мир битов

int.to_bytes() — это метод, который переводит целое число в бинарную форму:

Python
Скопировать код
# Беззнаковые целые в мире байтов: они скрываются от вас!
unsigned_int = 1024
bytes_unsigned = unsigned_int.to_bytes((unsigned_int.bit_length() + 7) // 8, 'big')
Python
Скопировать код
# Знаковые целые попадают в бинарные ловушки!
signed_int = -1024
bytes_signed = signed_int.to_bytes((8 + (signed_int + (signed_int < 0)).bit_length()) // 8, 'big', signed=True)

print(bytes_unsigned)  # Вывод: b'\x04\x00', идеальное представление в виде байтов
print(bytes_signed)    # Вывод: b'\\xfc\\x00', байтовая сущность отрицательного числа

Чтобы обратить байты в значение типа int, используйте функцию int.from_bytes():

Python
Скопировать код
print(int.from_bytes(bytes_unsigned, 'big'))          # Вывод: 1024, возвращение к истокам
print(int.from_bytes(bytes_signed, 'big', signed=True))  # Вывод: -1024, полный цикл преобразований

Если вы предпочитаете вещи простыми, модуль struct позволит вам управлять порядком байтов и форматами без лишнего балласта.

"n" в bytes(n): скрывает больше, чем кажется

bytes(n) — это не просто пустышка, это объект, содержащий n нулевых байтов. bytes в Python — это тип последовательности, аналогичный спискам или строкам, но предназначенный для работы с сырыми бинарными данными. Если вас интересует объект bytes, хранящий n в виде байта, то воспользуйтесь bytes([n]):

Python
Скопировать код
n = 65
single_byte = bytes([n])  # b'A', байт, в котором хранится "n"

Визуализация

Вообразите создание объектов bytes в Python, как рулоны туалетной бумаги 🧻:

Markdown
Скопировать код
Каждый рулон представляет из себя байт.

Используя bytes(n), представьте:

Markdown
Скопировать код
Вы вытягиваете рулон из `n` листов (байтов) 🧻, вместо одного листа, представляющего бинарное значение.

Видите в этом наглядность:

Markdown
Скопировать код
bytes(3) ➡️ 🧻🧻🧻 (Три чистых байта, без лишних слов!)

Главное, что нужно запомнить:

Markdown
Скопировать код
**bytes(n)** предлагает **n пустых мест** для байтов, но `n` остается в десятичной форме, не превращаясь в бинарное представление.

Что в байте? Литералы, последовательности и что вас ждёт

Байтовые литералы: раскрытие объективных значений

На байтовой вечеринке в Python каждый представлен особым образом. Вот b'3', b'\x33' или `b'\x03' — каждый уникален:

  • b'3' — ASCII-представление символа '3'.
  • b'\x33' — шестнадцатеричное значение 33, которое также соответствует ASCII-символу '3'.
  • `b'\x03' — управляющий символ ETX (End of Text), не имеющий отношения к цифре 3. Понимание этих специфических представлений — ключ к пониманию работы с байтами.

Создание байтовых последовательностей: встречайте байтовых драконов Z!

Если вам нужно создать конкретную последовательность байтов, вы можете сделать следующее:

Python
Скопировать код
# Добавляем в последовательность специальные символы
desired_sequence = bytes(str(n), 'ascii') + b'\r\n'   # Сетевой протокол будет доволен!

Либо создайте последовательность непосредственно из байтовых кодов:

Python
Скопировать код
sequence_of_values = bytes([51, 13, 10])   # Соберите суперкоманду из 51, 13, 10 — вперед, "Байтовые Рыцари"!

Интерполяция и совместимость: путешествие во времени

%-интерполяция работает как с объектами типа bytes, так и с bytearray в Python 3.5 и более поздних версиях.

Версии Python ранее 3.5 могут потребовать специальных методов кодирования для работы с объектами типа bytes. При переходе между Python 2 и 3, вам поможет модуль struct. Времена меняются, но Python помогает следить за ними!

Полезные материалы

  1. Python 3.12.2 Documentation — Built-in Types — Основная информация о bytes() в Python.
  2. The Difference Between a List and an Array | Python Central — Подробное объяснение разницы между bytes, bytearray, списками и массивами.
  3. Converting integers to bytes in Python 3 – stackoverflow — Подборка полезных советов по преобразованию целых чисел в байты в Python 3.
  4. Dive Into Python 3 – Native Data Types — Подробно рассмотрено использование bytes и его аналогов в контексте Python 3.
  5. Learning Steganography – Hide Text inside an Image – YouTube — Методы скрытия данных с помощью байтов.