Codecs¶
Имена на этой странице импортируются из bytespec.codecs.
Codec принимает и возвращает отдельное значение; заголовок модели он
добавляет только в случае ModelCodec. Примеры: Codecs: свой формат и свои типы.
Общий интерфейс¶
- class bytespec.codecs.ICodec(*args: Any, **kwargs: Any)[исходный код]¶
Интерфейс записи и чтения одного значения типа T.
Экземпляр можно передать в
field(codec=...). Наследование от ICodec необязательно: достаточно методов encode и decode с этим контрактом. Codec может переиспользоваться; позиция чтения передаётся через offset.decodeвозвращает значение и абсолютное смещение после него. При прямом использовании оставшиеся байты проверяет вызывающий код. При реализации собственного codec передавайте ошибки данных черезEncodeErrorиDecodeError.- encode(value: T, byte_order: ByteOrder, /) bytes[исходный код]¶
Записать одно значение в выбранном представлении.
- Параметры:
value – Значение для записи.
byte_order – Порядок байтов фиксированных чисел и префиксов.
- Результат:
Бинарное представление значения.
- Исключение:
EncodeError – Значение невозможно представить. Собственный codec должен сам использовать эту ошибку для ошибок данных.
- decode(buffer: bytes, byte_order: ByteOrder, offset: int, /) tuple[T, int][исходный код]¶
Прочитать одно значение начиная с offset.
- Параметры:
buffer – Буфер с закодированным значением.
byte_order – Порядок байтов фиксированных чисел и префиксов.
offset – Неотрицательная абсолютная позиция начала значения.
- Результат:
Значение и абсолютная позиция после него в том же буфере. Остальные байты не требуют полного потребления.
- Исключение:
DecodeError – Недостаточно байтов или значение некорректно. Реализация должна сама проверять границы и содержимое.
Примечание
Codec элемента списка должен продвигать offset на положительное число байтов, оставаясь в границах переданного буфера.
Требования к реализации¶
decode() должен возвращать абсолютную позицию после значения в том же
буфере, проверяя доступность нужных байтов. Экземпляр codec может
переиспользоваться: храните позицию в аргументах и результате, а не в
изменяемом внутреннем счётчике.
Для элемента списка обязательно продвижение на положительное число байтов
в пределах переданного буфера. ListCodec повторяет чтение до конца
своего содержимого и сам не проверяет увеличение смещения. Элементы нулевой
длины, например FixedBytesCodec(0), не подходят: их количество невозможно
восстановить из пустого содержимого.
Ошибки данных передавайте через EncodeError и DecodeError.
Ошибки реализации вроде TypeError или ValueError не оборачиваются.
Проверка протокола ICodec устанавливает наличие методов, но не
корректность их сигнатур или реализации.
Фиксированные числа¶
У всех числовых codecs интерфейс encode/decode из ICodec.
Используйте приведённые значения struct_format и length по умолчанию:
их ручное изменение требует согласовать размер struct и шаг decoder.
Конструктор проверяет синтаксис формата, но не согласованность этих параметров.
- class bytespec.codecs.UInt8Codec(struct_format: str = 'B', length: int = 1)[исходный код]¶
Беззнаковое 8-битное целое: 0–255, один байт по умолчанию.
- class bytespec.codecs.UInt16Codec(struct_format: str = 'H', length: int = 2)[исходный код]¶
Беззнаковое 16-битное целое: 0–65535, два байта по умолчанию.
- class bytespec.codecs.UInt32Codec(struct_format: str = 'I', length: int = 4)[исходный код]¶
Беззнаковое 32-битное целое: 0 .. 2**32 - 1, четыре байта.
- class bytespec.codecs.UInt64Codec(struct_format: str = 'Q', length: int = 8)[исходный код]¶
Беззнаковое 64-битное целое: 0 .. 2**64 - 1, восемь байт.
- class bytespec.codecs.Int8Codec(struct_format: str = 'b', length: int = 1)[исходный код]¶
Знаковое 8-битное целое: -128–127, один байт по умолчанию.
- class bytespec.codecs.Int16Codec(struct_format: str = 'h', length: int = 2)[исходный код]¶
Знаковое 16-битное целое: -32768–32767, два байта по умолчанию.
- class bytespec.codecs.Int32Codec(struct_format: str = 'i', length: int = 4)[исходный код]¶
Знаковое 32-битное целое: -2**31 .. 2**31 - 1, четыре байта.
- class bytespec.codecs.Int64Codec(struct_format: str = 'q', length: int = 8)[исходный код]¶
Знаковое 64-битное целое: -2**63 .. 2**63 - 1, восемь байт.
- class bytespec.codecs.Float32Codec(struct_format: str = 'f', length: int = 4)[исходный код]¶
IEEE 754 binary32: четыре байта с округлением Python float.
- class bytespec.codecs.Float64Codec(struct_format: str = 'd', length: int = 8)[исходный код]¶
IEEE 754 binary64: восемь байт в порядке байтов модели.
Varint и bool¶
- class bytespec.codecs.VarUIntCodec(*args: Any, **kwargs: Any)[исходный код]¶
Канонический unsigned varint: 0 .. 2**64 - 1, от 1 до 10 байт.
Группы по 7 бит записываются начиная с младшей. Порядок байтов модели на представление не влияет.
Канонический unsigned varint, диапазон
UInt64.
- class bytespec.codecs.VarIntCodec(*args: Any, **kwargs: Any)[исходный код]¶
Знаковый varint: ZigZag + unsigned varint, диапазон Int64.
Занимает 1–10 байт независимо от порядка байтов модели.
ZigZag + unsigned varint, диапазон
Int64.
- class bytespec.codecs.BoolCodec(*args: Any, **kwargs: Any)[исходный код]¶
Логическое значение в одном байте: 0 или 1.
Записывает истинность значения как 0/1; принимает при чтении только 0/1.
Строки, bytes, дата и UUID¶
- class bytespec.codecs.StrCodec(prefix_length: Literal[1, 2, 4, 8] | Annotated[int, VarIntSpec(signed=False)] = 4, encoding: str = 'utf-8')[исходный код]¶
Текст с префиксом длины закодированных байтов, не символов.
- Параметры:
prefix_length – Размер префикса: 1, 2, 4, 8 байт или
VarUInt. По умолчанию 4 байта.encoding – Кодировка Python, по умолчанию UTF-8.
- Исключение:
SchemaError – Неподдерживаемый префикс или неизвестная кодировка.
Префикс числа закодированных байтов и текст в выбранной кодировке.
- class bytespec.codecs.BytesCodec(prefix_length: Literal[1, 2, 4, 8] | Annotated[int, VarIntSpec(signed=False)] = 4)[исходный код]¶
Байты с префиксом их длины.
- Параметры:
prefix_length – Размер префикса: 1, 2, 4, 8 байт или
VarUInt. По умолчанию 4 байта. Сам префикс не входит в записанную длину.- Исключение:
SchemaError – Неподдерживаемый префикс, включая
VarInt.
Префикс длины и содержимое
bytes.
- class bytespec.codecs.FixedBytesCodec(length: int)[исходный код]¶
Ровно length байт без префикса длины.
- Параметры:
length – Неотрицательный фиксированный размер значения.
- Исключение:
SchemaError – Отрицательная длина.
Ровно
lengthбайт без префикса. Длина должна быть неотрицательной.
- class bytespec.codecs.DatetimeCodec(prefix_length: Literal[1, 2, 4, 8] | Annotated[int, VarIntSpec(signed=False)] = 4, encoding: str = 'utf-8')[исходный код]¶
Дата как строка ISO 8601 с префиксом длины.
Сохраняется смещение UTC из isoformat(), но не имя часовой зоны. Дата без tzinfo остаётся без него после чтения.
- Параметры:
prefix_length – Размер префикса: 1, 2, 4, 8 байт или
VarUInt.encoding – Кодировка ISO-строки, по умолчанию UTF-8.
- Исключение:
SchemaError – Неподдерживаемый префикс или неизвестная кодировка.
datetime.isoformat()черезStrCodec; чтение черезdatetime.fromisoformat().
- class bytespec.codecs.UUIDCodec[исходный код]¶
UUID как ровно 16 байт UUID.bytes, без префикса длины.
Порядок байтов модели не меняет это представление на bytes_le.
Ровно 16 байт
UUID.bytesнезависимо от порядка байтов модели.
Составные значения¶
- class bytespec.codecs.ListCodec(item_codec: ICodec[Any], prefix_length: Literal[1, 2, 4, 8] | Annotated[int, VarIntSpec(signed=False)] = 4)[исходный код]¶
Список с префиксом общего размера закодированных элементов в байтах.
- Параметры:
item_codec – Codec одного элемента. При чтении должен продвигать offset на положительное число байтов в пределах переданного буфера.
prefix_length – Размер префикса: 1, 2, 4, 8 байт или
VarUInt. По умолчанию 4 байта. Префикс не хранит количество элементов.
- Исключение:
SchemaError – Неподдерживаемый префикс длины.
Префикс длины общего payload в байтах.
item_codecдолжен читать один элемент за вызов и увеличивать смещение в границах буфера.
- class bytespec.codecs.EnumCodec(enum_type: type[Enum], value_codec: ICodec[Any])[исходный код]¶
Enum, записываемый через codec его значения.
- Параметры:
enum_type – Класс enum для восстановления через enum_type(value).
value_codec – Codec для .value, например StrCodec или UInt8Codec.
Кодирует
.valueчерез переданныйvalue_codec, восстанавливает элемент вызовомenum_type(value).
- class bytespec.codecs.ModelCodec(model_type: type[ProtoModel])[исходный код]¶
Вложенная модель со своим framing без Constructor и порядком байтов.
- Параметры:
model_type – Конкретный класс для чтения через decode_from(). Автоматического выбора подкласса по constructor нет.
Вызывает
encode(include_constructor=False)иmodel_type.decode_from(..., expect_constructor=False). Модель использует свой порядок байтов и header, пропуская Constructor. Другие элементы сохраняются. Тип вложенной модели определяется аннотацией.