Формат байтовых строк с префиксом b в языке Python

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

Байтовые литералы и префикс b

В Python строковый тип str хранит текст в кодировке Unicode, а байтовый тип bytes работает с необработанными данными (байтами). Литерал с префиксом b (например, b'text') создаёт объект bytes. Такой формат используется для двоичных протоколов, работы с файлами в режиме 'rb', криптографии, кодировок и сетевого обмена.

Как создать байтовую строку из литерала?

Самый простой способ - поставить префикс b перед строкой в одинарных или двойных кавычках. Допустимы только ASCII-символы (0-127), иначе возникнет синтаксическая ошибка. Для непечатных байтов используются escape-последовательности \xNN, \r, \n и т.д.

data = b'Python'
print(type(data))  # 
print(data)         # b'Python'

# с escape-последовательностями
byte_seq = b'\x48\x65\x6c\x6c\x6f'  # 'Hello'
print(byte_seq)  # b'Hello'

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

Цель: быстрая инициализация заранее известных байтовых данных (например, сигнатур файлов, заголовков протоколов).

Типичная ошибка: попытка записать не-ASCII символ, например b'Привет' вызовет SyntaxError. Для Unicode-текста сначала преобразуйте в байты через .encode().

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

Для перехода между str и bytes используются методы .encode() и .decode(). По умолчанию кодировка - UTF-8.

text = "Пример"
b_data = text.encode('utf-8')   # b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xbc\xd0\xb5\xd1\x80'
original = b_data.decode('utf-8')  # 'Пример'
print(original)

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

Цель: передача текстовых данных через бинарные каналы (сокеты, файлы, шифрование).

Ошибка: если байты не соответствуют выбранной кодировке, возникает UnicodeDecodeError. Решение - указать параметр errors='ignore' или 'replace'.

Как создать объект bytes из последовательности чисел?

Встроенный конструктор bytes() принимает итератор целых чисел от 0 до 255 или bytes-подобный объект.

numbers = [72, 101, 108, 108, 111]  # коды ASCII
b = bytes(numbers)
print(b)  # b'Hello'

# из строки (преобразует символы в коды ASCII)
b2 = bytes('ABC', 'utf-8')
print(b2)  # b'ABC'

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

Цель: создание байтов из вычисленных значений, например, при генерации пакетов данных.

Ошибка: передача числа больше 255 вызывает ValueError: bytes must be in range(0, 256).

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

Тип bytearray - изменяемый аналог bytes. Поддерживает операции присваивания по индексу и методы строкоподобного API.

ba = bytearray(b'hello')
ba[0] = 72  # изменяем первый байт (H)
ba.append(33)  # добавляем '!'
print(ba)  # bytearray(b'Hello!')

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

Цель: эффективная модификация бинарных данных без создания копий (например, при редактировании заголовков файлов).

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

Метод .hex() возвращает строку из двухсимвольных hex-цифр. Статический метод bytes.fromhex() восстанавливает байты.

hex_str = b'\x48\x65\x6c'.hex()  # '48656c'
b = bytes.fromhex('48656c')        # b'Hel'
print(b)

Цель: удобное представление бинарных данных для логирования или передачи в текстовых протоколах (JSON, XML).

Как правильно указать кодировку при преобразовании строк?

Вторым аргументом .encode() и .decode() передаётся кодировка (по умолчанию 'utf-8'). Другие популярные: 'latin-1', 'cp1251', 'utf-16'.

text = "Русский"
b_utf8 = text.encode('utf-8')
b_cp1251 = text.encode('cp1251')
print(b_utf8)    # b'\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9'
print(b_cp1251)  # b'\xd0\xf3\xf1\xf1\xea\xe8\xe9'

Цель: совместимость с устаревшими системами или специфическими требованиями кодировок.

Проблема: неправильный выбор кодировки приведёт к искажению данных. Всегда необходимо согласование с источником данных.

Итог: префикс b и связанные методы дают гибкий инструмент для работы с бинарными данными. Выбор подхода зависит от задачи: литералы для констант, encode/decode для текста, bytes() для чисел, bytearray для изменяемых последовательностей.

Расширенные примеры работы с байтами

Чтение бинарного файла и анализ сигнатуры

Открытие файла в режиме 'rb' возвращает байтовые строки. Следующий код проверяет, является ли файл PNG (сигнатура b'\x89PNG\r\n\x1a\n').

Пример
def check_png(filename):
    with open(filename, 'rb') as f:
        header = f.read(8)
        png_signature = b'\x89PNG\r\n\x1a\n'
        return header == png_signature

print(check_png('image.png'))  # True или False

Результат: сравнение сигнатуры подтверждает формат.

Работа с сокетами (TCP)

Сетевые сокеты передают только байты. Пример отправки и получения сообщения.

Пример
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('httpbin.org', 80))
request = b'GET /ip HTTP/1.1\r\nHost: httpbin.org\r\n\r\n'
sock.send(request)
response = b''
while True:
    chunk = sock.recv(4096)
    if not chunk:
        break
    response += chunk
print(response.decode('utf-8', errors='ignore')[:200])

Результат: HTTP-ответ в виде строки (после декодирования).

Хеширование данных (hashlib)

Функции хеширования принимают байты. Пример вычисления SHA-256 для строки.

Пример
import hashlib

text = 'Привет, мир!'
b_data = text.encode('utf-8')
hash_obj = hashlib.sha256(b_data)
hex_dig = hash_obj.hexdigest()
print(hex_dig)  # 'dfd7c3d...'

Пояснение: метод .hexdigest() возвращает строку из 64 шестнадцатеричных цифр.

Кодирование/декодирование Base64

Библиотека base64 работает с байтами. Пример кодирования изображения (текстовое представление).

Пример
import base64

with open('example.png', 'rb') as f:
    raw = f.read()
encoded = base64.b64encode(raw)
print(encoded[:50])  # b'iVBORw0KGgo...'

decoded = base64.b64decode(encoded)
print(decoded == raw)  # True

Цель: передача бинарных данных через каналы, поддерживающие только текст (JSON, электронная почта).

Работа с шифрованием (пример AES)

Симметричное шифрование оперирует байтами. Упрощённый пример с использованием библиотеки cryptography (рекомендуется для реальных проектов).

Пример
from cryptography.fernet import Fernet

key = Fernet.generate_key()
cipher = Fernet(key)
b_data = b'Секретное сообщение'
encrypted = cipher.encrypt(b_data)
print(encrypted[:30])  # байты в зашифрованном виде

decrypted = cipher.decrypt(encrypted)
print(decrypted)  # b'Секретное сообщение'

Примечание: метод encrypt принимает и возвращает байты.

Преобразование чисел в байты и обратно (struct)

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

Пример
import struct

# упаковка: целое 42 в 4 байта (little-endian)
packed = struct.pack('

Использование: чтение бинарных структур файлов (BMP, WAV) или сетевых пакетов.

Эффективная обработка больших объёмов байт (memoryview)

Объект memoryview даёт доступ к внутреннему буферу без копирования.

Пример
data = bytearray(b'Python' * 1000000)
view = memoryview(data)
# срез без копирования
part = view[:10]
print(bytes(part))  # b'PythonPyt'

Цель: экономия памяти при манипуляции крупными бинарными данными.

Формат b в Python - comments

En
Python b format (python)