Bytes: примеры (PYTHON)
bytes(source: int or iterable of ints or str = ..., encoding: str = ..., errors: str = ...): bytesФункция bytes в языке программирования Python
Функция bytes() является встроенной в Python и предназначена для создания неизменяемого объекта типа bytes, представляющего последовательность байтов. Использование функции находит применение при работе с бинарными данными, взаимодействии с файловыми системами, сетевыми протоколами и шифрованием, где необходима обработка данных в виде байтов.
Функция может вызываться с различными аргументами:
- bytes([source[, encoding[, errors]]]) – общая форма вызова.
- source (необязательный) – определяет исходные данные для преобразования в bytes. Может быть:
- Целое число – создает bytes объект указанного размера, заполненный нулевыми байтами.
- Итерируемый объект из целых чисел в диапазоне 0 ≤ x < 256.
- Объект, реализующий буферный протокол (buffer protocol), например, bytes или bytearray.
- Строка (string) – требует также указания параметров encoding и errors для преобразования строки в байты.
- encoding (необязательный) – строка, задающая кодировку, если source является строкой. Например, 'utf-8', 'ascii'.
- errors (необязательный) – строка, задающая политику обработки ошибок кодирования. Например, 'strict', 'ignore', 'replace'.
Возвращаемым значением является новый объект bytes, неизменяемая последовательность байтов. Если аргументы не переданы, возвращается пустой bytes объект.
Базовые варианты применения функции bytes
Пример создания пустого bytes объекта:
empty_bytes = bytes()
print(empty_bytes)b''
Создание bytes объекта заданного размера:
bytes_from_int = bytes(5)
print(bytes_from_int)b'\x00\x00\x00\x00\x00'
Преобразование списка целых чисел в bytes:
bytes_from_list = bytes([65, 66, 67, 127, 255])
print(bytes_from_list)b'ABC\x7f\xff'
Преобразование строки в байты с указанием кодировки:
bytes_from_str = bytes('Привет', encoding='utf-8')
print(bytes_from_str)b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'
Использование параметра errors при преобразовании строки:
bytes_with_replace = bytes('Café©', encoding='ascii', errors='replace')
print(bytes_with_replace)b'Caf??'
Похожие функции и методы в Python
В Python существуют несколько альтернативных способов работы с байтовыми данными:
- bytearray() – создает изменяемую последовательность байтов. Используется, когда требуется модифицировать содержимое после создания.
- str.encode(encoding='utf-8', errors='strict') – метод строк, преобразующий строку в bytes. Часто бывает удобнее, чем вызов
bytes()для строки. - memoryview() – создает объект memoryview, который предоставляет доступ к внутренним данным объекта без копирования. Полезен для эффективной работы с большими массивами данных.
Предпочтительнее использовать str.encode() для преобразования строк, так как это более читаемый и прямой способ. bytearray применяется при необходимости изменения байтов, а bytes – для создания неизменяемых последовательностей.
Аналоги функции bytes в других языках программирования
Концепция работы с байтовыми последовательностями существует во многих языках.
JavaScript: Типизированные массивы, например, Uint8Array.
let bytes = new Uint8Array([65, 66, 67]);
console.log(bytes);Uint8Array(3) [ 65, 66, 67 ]
Java: Класс byte[] или ByteBuffer.
byte[] bytes = {65, 66, 67};
System.out.println(Arrays.toString(bytes));[65, 66, 67]
Go: Встроенный тип []byte (срез байтов).
bytes := []byte{65, 66, 67}
fmt.Println(bytes)[65 66 67]
PHP: Строки уже являются последовательностями байтов. Для явного создания используется pack() или просто строка.
$bytes = "ABC";
echo bin2hex($bytes);414243
Основное отличие Python – наличие отдельного неизменяемого типа bytes и изменяемого bytearray, а также тесная интеграция с системами кодирования строк.
Распространенные ошибки при работе с bytes
Ошибка при передаче строки без указания кодировки:
try:
b = bytes('текст')
except TypeError as e:
print(f'Ошибка: {e}')Ошибка: string argument without an encoding
Передача целых чисел вне допустимого диапазона 0-255:
try:
b = bytes([256, -1])
except ValueError as e:
print(f'Ошибка: {e}')Ошибка: bytes must be in range(0, 256)
Попытка изменить элемент bytes объекта (неизменяемость):
b = bytes([1, 2, 3])
try:
b[0] = 10
except TypeError as e:
print(f'Ошибка: {e}')Ошибка: 'bytes' object does not support item assignment
Изменения в функции bytes в последних версиях Python
В Python 3.5 появился метод класса bytes.fromhex(), который позволяет создавать bytes объект из строки, содержащей шестнадцатеричные числа. Однако сама функция bytes() не претерпела значительных изменений в своей сигнатуре с момента введения в Python 3.
В Python 3.7 улучшена производительность для некоторых случаев создания bytes объектов из итерируемых объектов. В Python 3.10 и 3.11 продолжаются внутренние оптимизации, не затрагивающие API.
Расширенные и специализированные примеры
Создание bytes из объекта bytes (копирование):
original = b'hello'
new = bytes(original)
print(new is original)
print(new == original)False True
Использование bytes с объектом memoryview:
arr = bytearray(b'Hello')
view = memoryview(arr)
bytes_from_view = bytes(view[1:4])
print(bytes_from_view)b'ell'
Работа с различными кодировками и обработкой ошибок:
text = 'Café和Café'
bytes_utf8 = bytes(text, encoding='utf-8')
bytes_utf16 = bytes(text, encoding='utf-16-le')
bytes_ignore = bytes(text, encoding='ascii', errors='ignore')
print('UTF-8:', bytes_utf8)
print('UTF-16-LE:', bytes_utf16)
print('ASCII ignore:', bytes_ignore)UTF-8: b'Caf\xc3\xa9\xe5\x92\x8cCaf\xc3\xa9' UTF-16-LE: b'C\x00a\x00f\x00\xe9\x00\x0c\x54\x00\x00C\x00a\x00f\x00\xe9\x00' ASCII ignore: b'CafCaf'
Использование bytes вместе с модулем struct для упаковки данных:
import struct
packed = struct.pack('>i', 1024) # big-endian 4-byte integer
bytes_from_struct = bytes(packed)
print(bytes_from_struct)b'\x00\x00\x04\x00'
Преобразование bytes в шестнадцатеричное представление и обратно с использованием bytes.fromhex():
hex_str = 'DEADBEEF'
b = bytes.fromhex(hex_str)
print(b)
print(b.hex().upper())b'\xde\xad\xbe\xef' DEADBEEF