Строки с префиксом b: работа с байтами в Python

Раздел: Основы Python -> Работа со строками и байтами

Основы байтовых строк (b-строк)

Байтовые литералы в Python создаются с помощью префикса b или B перед строкой в кавычках: b'текст' или b"текст". Результатом будет объект типа bytes, а не str. Основное отличие – bytes представляет последовательность чисел (0–255), тогда как str – последовательность символов Unicode. Байтовые строки используются для работы с бинарными данными (файлы, сетевые протоколы, шифрование) и при взаимодействии с системными вызовами. Пример:
data = b'hello'
print(type(data))  # <class 'bytes'>
print(data)        # b'hello'

использование b в python (использование префикса b в python)

Каждый символ в литерале b'hello' должен принадлежать ASCII (0-127), иначе Python вызовет синтаксическую ошибку. Для не-ASCII символов нужно использовать соответствующие коды или эскейп-последовательности.
Проблема: если в b'' встретится символ вне ASCII (например, русская буква), возникнет SyntaxError: bytes can only contain ASCII literal characters. Решение: использовать эскейп-последовательности (\x, \u, \U) или преобразовывать строку в байты через метод .encode().

Как преобразовать обычную строку в байты и обратно?

Основной способ – методы .encode() и .decode(). encode переводит str в bytes с заданной кодировкой (по умолчанию UTF-8). decode делает обратное. Пример:
text = 'Привет'
bytes_text = text.encode('utf-8')
print(bytes_text)  # b'\xd0\x9f\xd1\x80\xd0\xb8...'
back = bytes_text.decode('utf-8')
print(back)        # Привет

Str b a в python 3 (префикс b для строк в python 3)

Ошибка: если кодировка при декодировании не совпадает с той, что использовалась при кодировании, возникает UnicodeDecodeError. Всегда указывайте правильную кодировку (чаще всего utf-8).
Для проверки совместимости используйте аргумент errors='ignore' или errors='replace'.

Как работать с байтовыми данными из файлов?

При открытии файла в бинарном режиме ('rb' или 'wb') чтение/запись происходит в виде байтов, а не строк. Это необходимо для изображений, звука, архивов. Пример:
with open('image.jpg', 'rb') as f:
    raw = f.read(100)  # первые 100 байт
    print(raw[:10])   # b'\xff\xd8\xff\xe0...'

Python b string (строки с префиксом b в python)

Если открыть такой файл в текстовом режиме, Python попытается декодировать содержимое, что может привести к ошибкам.
Распространённая ошибка: попытка записать str в файл, открытый в бинарном режиме ('wb'). Возникает TypeError: a bytes-like object is required, not 'str'. Решение: предварительно кодировать строку через .encode().

Как объединить байтовые строки и строки?

Прямая конкатенация b'hello' + 'world' вызовет TypeError, так как типы разные. Нужно привести их к одному типу: либо преобразовать байты в строку (декодировать), либо строку в байты (закодировать). Пример:
part1 = b'Hello '
part2 = 'World'
result = part1 + part2.encode('ascii')
print(result)  # b'Hello World'

Python b format (формат b в python)

Как использовать байты для работы с сетевыми протоколами?

Библиотеки вроде socket ожидают данные в виде байтов. Пример отправки сообщения:
import socket
sock = socket.socket()
sock.connect(('example.com', 80))
request = b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n'
sock.send(request)
response = sock.recv(1024)  # bytes
print(response[:50])
При разборе ответа часто используют метод .split() для байтов, но помните – разделитель тоже должен быть байтовым (например, b'\r\n').

Как упаковать числа в байты (struct)?

Модуль struct позволяет преобразовывать числа и другие типы в байтовые последовательности фиксированной длины. Это важно для бинарных форматов данных. Пример:
import struct
# упаковка целого 42 в 4 байта (little-endian)
packed = struct.pack('<i', 42)
print(packed)  # b'*\x00\x00\x00'
# распаковка
unpacked = struct.unpack('<i', packed)
print(unpacked[0])  # 42
Модуль struct требует строгого задания формата; ошибки при несовпадении длины приводят к struct.error.

Как проверить, является ли переменная байтовой строкой?

Используйте встроенную функцию isinstance():
value = b'abc'
if isinstance(value, bytes):
    print('Это байты')
else:
    print('Это строка или что-то ещё')
Это помогает писать надёжный код, работающий с разными типами.

Расширенные примеры работы с b-строками

Пример
# Пример 1: чтение EXIF из JPEG (первые 2 байта – сигнатура)
with open('photo.jpg', 'rb') as f:
    header = f.read(2)
    if header == b'\xff\xd8':
        print('Это JPEG файл')
    else:
        print('Неизвестный формат')
Это JPEG файл
Пример
# Пример 2: преобразование целого числа в байты и обратно с разным порядком байт
import struct
value = 1024
big = struct.pack('>I', value)  # big-endian
little = struct.pack('<I', value) # little-endian
print(big)    # b'\x00\x00\x04\x00'
print(little) # b'\x00\x04\x00\x00'
# распаковка
print(struct.unpack('>I', big)[0])   # 1024
print(struct.unpack('<I', little)[0])# 1024
b'\x00\x00\x04\x00'
b'\x00\x04\x00\x00'
1024
1024
Пример
# Пример 3: работа с бинарным протоколом (имитация записи переменной длины)
import struct
def encode_varint(value):
    # простой вариант: 1 байт для значений <128
    if value < 128:
        return bytes([value])
    else:
        return struct.pack('>H', value)  # 2 байта
packet = b'\x02' + encode_varint(100)  # тип сообщения + длина
print(packet)  # b'\x02d' (d = 100 в ASCII)
b'\x02d'
Пример
# Пример 4: безопасное декодирование с игнорированием ошибок
raw = b'\xff\xfe\x00\x41'
try:
    text = raw.decode('utf-8')
except UnicodeDecodeError:
    text = raw.decode('utf-8', errors='ignore')
print(text)  # 'A' (непечатные символы отброшены)
A
Пример
# Пример 5: создание байтовой строки с помощью bytes()
# из списка целых чисел
bytes_from_list = bytes([72, 101, 108, 108, 111])  # 'Hello'
print(bytes_from_list)  # b'Hello'
# из форматированной строки с эскейпами
bytes_with_escapes = b'line1\nline2\tindent'
print(bytes_with_escapes)  # b'line1\nline2\tindent'
b'Hello'
b'line1\nline2\tindent'
Пример
# Пример 6: сравнение байтов и строк
byte_version = b'abc'
str_version = 'abc'
print(byte_version == str_version)  # False – разные типы
print(byte_version.decode('ascii') == str_version)  # True
False
True

Строки с префиксом b в Python - comments

En
Python b string (python)