Почему bytes(n) в Python создаёт строку нулевых байтов?
Быстрый ответ
Функция bytes(n)
создаёт объект bytes
содержащий n
нулевых байтов, а не переводит n
в бинарный код. Если необходимо получить бинарное представление числа, используйте bin(n)[2:]
, обрезая префикс '0b'. n.to_bytes(length, 'little')
преобразует n
в объект типа bytes
, где length
— это минимально необходимое количество байт для размещения n
.
binary_n = bin(n)[2:] # '101' для n=5, наглядный бинарный код
bytes_n = n.to_bytes(1, 'little') # b'\x05', представление числа в виде байта
n = 5
print(binary_n) # Вывод: '101', ясное и краткое
print(bytes_n) # Вывод: b'\x05', компактно и точно
Преобразование int в байты: погружение в мир битов
int.to_bytes()
— это метод, который переводит целое число в бинарную форму:
# Беззнаковые целые в мире байтов: они скрываются от вас!
unsigned_int = 1024
bytes_unsigned = unsigned_int.to_bytes((unsigned_int.bit_length() + 7) // 8, 'big')
# Знаковые целые попадают в бинарные ловушки!
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()
:
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])
:
n = 65
single_byte = bytes([n]) # b'A', байт, в котором хранится "n"
Визуализация
Вообразите создание объектов bytes
в Python, как рулоны туалетной бумаги 🧻:
Каждый рулон представляет из себя байт.
Используя bytes(n)
, представьте:
Вы вытягиваете рулон из `n` листов (байтов) 🧻, вместо одного листа, представляющего бинарное значение.
Видите в этом наглядность:
bytes(3) ➡️ 🧻🧻🧻 (Три чистых байта, без лишних слов!)
Главное, что нужно запомнить:
**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!
Если вам нужно создать конкретную последовательность байтов, вы можете сделать следующее:
# Добавляем в последовательность специальные символы
desired_sequence = bytes(str(n), 'ascii') + b'\r\n' # Сетевой протокол будет доволен!
Либо создайте последовательность непосредственно из байтовых кодов:
sequence_of_values = bytes([51, 13, 10]) # Соберите суперкоманду из 51, 13, 10 — вперед, "Байтовые Рыцари"!
Интерполяция и совместимость: путешествие во времени
%-интерполяция
работает как с объектами типа bytes
, так и с bytearray
в Python 3.5 и более поздних версиях.
Версии Python ранее 3.5 могут потребовать специальных методов кодирования для работы с объектами типа bytes
. При переходе между Python 2 и 3, вам поможет модуль struct
. Времена меняются, но Python помогает следить за ними!
Полезные материалы
- Python 3.12.2 Documentation — Built-in Types — Основная информация о
bytes()
в Python. - The Difference Between a List and an Array | Python Central — Подробное объяснение разницы между
bytes
,bytearray
, списками и массивами. - Converting integers to bytes in Python 3 – stackoverflow — Подборка полезных советов по преобразованию целых чисел в байты в Python 3.
- Dive Into Python 3 – Native Data Types — Подробно рассмотрено использование
bytes
и его аналогов в контексте Python 3. - Learning Steganography – Hide Text inside an Image – YouTube — Методы скрытия данных с помощью байтов.