xdrlib.md
1> **Источник:** https://python-all.ru/3.11/library/xdrlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`xdrlib`](https://python-all.ru/3.11/library/xdrlib.html#module-xdrlib) – Кодирование и декодирование XDR-данных89**Исходный код:** [Lib/xdrlib.py](https://python-all.ru/src/3.11/Lib/xdrlib.py)1011Устарело с версии 3.11, будет удалено в версии 3.13: Модуль [`xdrlib`](https://python-all.ru/3.11/library/xdrlib.html#module-xdrlib) устарел (см. [**PEP 594**](https://python-all.ru/3.11/library/xdrlib.html) для подробностей).1213---1415Модуль [`xdrlib`](https://python-all.ru/3.11/library/xdrlib.html#module-xdrlib) реализует стандарт внешнего представления данных (External Data Representation Standard), описанный в [**RFC 1014**](https://python-all.ru/3.11/library/xdrlib.html), написанном Sun Microsystems, Inc. в июне 1987 года. Он поддерживает большинство типов данных, описанных в этом RFC.1617Модуль [`xdrlib`](https://python-all.ru/3.11/library/xdrlib.html#module-xdrlib) определяет два класса: один для упаковки переменных в представление XDR, другой для распаковки из представления XDR. Также определены два класса исключений.1819#### `class xdrlib.Packer`2021[`Packer`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Packer) – это класс для упаковки данных в представление XDR. Класс [`Packer`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Packer) создаётся без аргументов.2223#### `class xdrlib.Unpacker(data)`2425`Unpacker` – это дополнительный класс, который распаковывает значения данных XDR из строкового буфера. Входной буфер передаётся как *data*.2627> **См. также**28>29> **[**RFC 1014**](https://python-all.ru/3.11/library/xdrlib.html) – XDR: стандарт внешнего представления данных**30>31> Этот RFC определял кодирование данных XDR на момент написания этого модуля. По-видимому, он устарел и заменён [**RFC 1832**](https://python-all.ru/3.11/library/xdrlib.html).32>33> **[**RFC 1832**](https://python-all.ru/3.11/library/xdrlib.html) – XDR: стандарт внешнего представления данных**34>35> Более новый RFC, содержащий исправленное определение XDR.3637## Объекты Packer3839Экземпляры [`Packer`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Packer) имеют следующие методы:4041#### `Packer.get_buffer()`4243Возвращает текущий буфер упаковки в виде строки.4445#### `Packer.reset()`4647Сбрасывает буфер упаковки в пустую строку.4849В целом, можно упаковать любой из наиболее распространённых типов данных XDR, вызвав соответствующий метод `pack_type()`. Каждый метод принимает один аргумент – упаковываемое значение. Поддерживаются следующие простые методы упаковки типов данных: `pack_uint()`, `pack_int()`, `pack_enum()`, `pack_bool()`, `pack_uhyper()` и `pack_hyper()`.5051#### `Packer.pack_float(value)`5253Упаковывает число с плавающей запятой одинарной точности *value*.5455#### `Packer.pack_double(value)`5657Упаковывает число с плавающей запятой двойной точности *value*.5859Следующие методы поддерживают упаковку строк, байтов и непрозрачных данных:6061#### `Packer.pack_fstring(n, s)`6263Упаковывает строку фиксированной длины *s*. *n* – это длина строки, но она *не* упаковывается в буфер данных. При необходимости строка дополняется нулевыми байтами для обеспечения выравнивания на 4 байта.6465#### `Packer.pack_fopaque(n, data)`6667Упаковывает непрозрачный поток данных фиксированной длины, аналогично [`pack_fstring()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Packer.pack_fstring).6869#### `Packer.pack_string(s)`7071Упаковывает строку переменной длины *s*. Сначала длина строки упаковывается как беззнаковое целое, затем строковые данные упаковываются с помощью [`pack_fstring()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Packer.pack_fstring).7273#### `Packer.pack_opaque(data)`7475Упаковывает непрозрачную строку данных переменной длины, аналогично [`pack_string()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Packer.pack_string).7677#### `Packer.pack_bytes(bytes)`7879Упаковывает поток байт переменной длины, аналогично [`pack_string()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Packer.pack_string).8081Следующие методы поддерживают упаковку массивов и списков:8283#### `Packer.pack_list(list, pack_item)`8485Упаковывает *список* однородных элементов. Этот метод полезен для списков с неопределённым размером; т.е. размер становится известен только после обхода всего списка. Для каждого элемента списка сначала упаковывается беззнаковое целое `1`, затем значение данных из списка. *pack\_item* – это функция, которая вызывается для упаковки отдельного элемента. В конце списка упаковывается беззнаковое целое `0`.8687Например, чтобы упаковать список целых чисел, код может выглядеть так:8889```python90import xdrlib91p = xdrlib.Packer()92p.pack_list([1, 2, 3], p.pack_int)93```9495#### `Packer.pack_farray(n, array, pack_item)`9697Упаковывает список фиксированной длины (*массив*) однородных элементов. *n* – это длина списка; она *не* упаковывается в буфер, но генерируется исключение [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError), если `len(array)` не равно *n*. Как и выше, *pack\_item* – это функция, используемая для упаковки каждого элемента.9899#### `Packer.pack_array(list, pack_item)`100101Упаковывает *список* однородных элементов переменной длины. Сначала длина списка упаковывается как беззнаковое целое, затем каждый элемент упаковывается, как в [`pack_farray()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Packer.pack_farray) выше.102103## Объекты Unpacker104105Класс [`Unpacker`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Unpacker) предоставляет следующие методы:106107#### `Unpacker.reset(data)`108109Сбрасывает строковый буфер с указанными *данными*.110111#### `Unpacker.get_position()`112113Возвращает текущую позицию распаковки в буфере данных.114115#### `Unpacker.set_position(position)`116117Устанавливает позицию распаковки в буфере данных на *позицию*. Следует быть осторожным при использовании [`get_position()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Unpacker.get_position) и [`set_position()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Unpacker.set_position).118119#### `Unpacker.get_buffer()`120121Возвращает текущий буфер данных распаковки в виде строки.122123#### `Unpacker.done()`124125Указывает на завершение распаковки. Генерирует исключение [`Error`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Error), если не все данные были распакованы.126127Кроме того, каждый тип данных, который можно упаковать с помощью [`Packer`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Packer), можно распаковать с помощью [`Unpacker`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Unpacker). Методы распаковки имеют вид `unpack_type()` и не принимают аргументов. Они возвращают распакованный объект.128129#### `Unpacker.unpack_float()`130131Распаковывает число с плавающей точкой одинарной точности.132133#### `Unpacker.unpack_double()`134135Распаковывает число с плавающей точкой двойной точности, аналогично [`unpack_float()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Unpacker.unpack_float).136137Кроме того, следующие методы распаковывают строки, байты и непрозрачные данные:138139#### `Unpacker.unpack_fstring(n)`140141Распаковывает и возвращает строку фиксированной длины. *n* – это ожидаемое количество символов. Предполагается дополнение нулевыми байтами для гарантированного выравнивания до 4 байт.142143#### `Unpacker.unpack_fopaque(n)`144145Распаковывает и возвращает непрозрачный поток данных фиксированной длины, аналогично [`unpack_fstring()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Unpacker.unpack_fstring).146147#### `Unpacker.unpack_string()`148149Распаковывает и возвращает строку переменной длины. Сначала длина строки распаковывается как беззнаковое целое, затем данные строки распаковываются с помощью [`unpack_fstring()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Unpacker.unpack_fstring).150151#### `Unpacker.unpack_opaque()`152153Распаковывает и возвращает строку непрозрачных данных переменной длины, аналогично [`unpack_string()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Unpacker.unpack_string).154155#### `Unpacker.unpack_bytes()`156157Распаковывает и возвращает поток байтов переменной длины, аналогично [`unpack_string()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Unpacker.unpack_string).158159Следующие методы поддерживают распаковку массивов и списков:160161#### `Unpacker.unpack_list(unpack_item)`162163Распаковывает и возвращает список однородных элементов. Список распаковывается поэлементно: сначала распаковывается беззнаковый целочисленный флаг. Если флаг равен `1`, то элемент распаковывается и добавляется в список. Флаг `0` обозначает конец списка. *unpack\_item* – это функция, которая вызывается для распаковки элементов.164165#### `Unpacker.unpack_farray(n, unpack_item)`166167Распаковывает и возвращает (в виде списка) массив фиксированной длины из однородных элементов. *n* – это количество элементов списка, которое ожидается в буфере. Как и выше, *unpack\_item* – это функция, используемая для распаковки каждого элемента.168169#### `Unpacker.unpack_array(unpack_item)`170171Распаковывает и возвращает *список* однородных элементов переменной длины. Сначала длина списка распаковывается как беззнаковое целое, затем каждый элемент распаковывается, как в [`unpack_farray()`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Unpacker.unpack_farray) выше.172173## Исключения174175Исключения в этом модуле реализованы как экземпляры классов:176177#### `exception xdrlib.Error`178179Базовый класс исключений. [`Error`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Error) имеет единственный публичный атрибут `msg`, содержащий описание ошибки.180181#### `exception xdrlib.ConversionError`182183Класс, производный от [`Error`](https://python-all.ru/3.11/library/xdrlib.html#xdrlib.Error). Не содержит дополнительных переменных экземпляра.184185Вот пример того, как можно перехватить одно из этих исключений:186187```python188import xdrlib189p = xdrlib.Packer()190try:191 p.pack_double(8.01)192except xdrlib.ConversionError as instance:193 print('packing the double failed:', instance.msg)194```195