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