> **Источник:** https://python-all.ru/3.0/library/xdrlib.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `xdrlib` – Кодирование и декодирование данных XDR

Модуль `xdrlib` реализует стандарт внешнего представления данных (External Data Representation), как описано в [**RFC 1014**](https://python-all.ru/3.0/library/xdrlib.html) (Sun Microsystems, Inc., июнь 1987 г.). Он поддерживает большинство типов данных, описанных в этом RFC.

Модуль `xdrlib` определяет два класса: один для упаковки переменных в представление XDR, и другой для распаковки из представления XDR. Также определены dва класса исключений.

#### `[xdrlib.Packer]class xdrlib.Packer`

[`Packer`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer)

– это класс для упаковки данных в представление XDR. Класс

[`Packer`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer)

создаётся без аргументов.

#### `[xdrlib.Unpacker]class xdrlib.Unpacker(data)`

`Unpacker`

– это дополнительный класс, который распаковывает значения данных XDR из строкового буфера. Входной буфер передаётся как

*data*

.

> **См. также**
>
> **[**RFC 1014**](https://python-all.ru/3.0/library/xdrlib.html) – XDR: стандарт внешнего представления данных**
>
> Этот RFC определял кодирование данных XDR на момент написания этого модуля. По-видимому, он устарел и заменён
>
> [**RFC 1832**](https://python-all.ru/3.0/library/xdrlib.html)
>
> .
>
> **[**RFC 1832**](https://python-all.ru/3.0/library/xdrlib.html) – XDR: стандарт внешнего представления данных**
>
> Более новый RFC, содержащий исправленное определение XDR.

## Объекты Packer

Экземпляры [`Packer`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer) имеют следующие методы:

#### `[xdrlib.Packer.get_buffer]Packer.get_buffer()`

Возвращает текущий буфер упаковки в виде строки.

#### `[xdrlib.Packer.reset]Packer.reset()`

Сбрасывает буфер упаковки в пустую строку.

В целом, можно упаковать любой из наиболее распространённых типов данных XDR, вызвав соответствующий метод `pack_type()`. Каждый метод принимает один аргумент – упаковываемое значение. Поддерживаются следующие простые методы упаковки типов данных: `pack_uint()`, `pack_int()`, `pack_enum()`, `pack_bool()`, `pack_uhyper()` и `pack_hyper()`.

#### `[xdrlib.Packer.pack_float]Packer.pack_float(value)`

Упаковывает число с плавающей запятой одинарной точности

*value*

.

#### `[xdrlib.Packer.pack_double]Packer.pack_double(value)`

Упаковывает число с плавающей запятой двойной точности

*value*

.

Следующие методы поддерживают упаковку строк, байтов и непрозрачных данных:

#### `[xdrlib.Packer.pack_fstring]Packer.pack_fstring(n, s)`

Упаковывает строку фиксированной длины

*s*

.

*n*

– это длина строки, но она

*не*

упаковывается в буфер данных. При необходимости строка дополняется нулевыми байтами для обеспечения выравнивания на 4 байта.

#### `[xdrlib.Packer.pack_fopaque]Packer.pack_fopaque(n, data)`

Упаковывает поток непрозрачных данных фиксированной длины, аналогично

[`pack_fstring()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer.pack_fstring)

.

#### `[xdrlib.Packer.pack_string]Packer.pack_string(s)`

Упаковывает строку переменной длины

*s*

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

[`pack_fstring()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer.pack_fstring)

.

#### `[xdrlib.Packer.pack_opaque]Packer.pack_opaque(data)`

Упаковывает строку непрозрачных данных переменной длины, аналогично

[`pack_string()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer.pack_string)

.

#### `[xdrlib.Packer.pack_bytes]Packer.pack_bytes(bytes)`

Упаковывает поток байтов переменной длины, аналогично

[`pack_string()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer.pack_string)

.

Следующие методы поддерживают упаковку массивов и списков:

#### `[xdrlib.Packer.pack_list]Packer.pack_list(list, pack_item)`

Упаковывает *список* однородных элементов. Этот метод полезен для списков с неопределённым размером; т.е. размер становится известен только после обхода всего списка. Для каждого элемента списка сначала упаковывается беззнаковое целое `1`, затем значение данных из списка. *pack\_item* – это функция, которая вызывается для упаковки отдельного элемента. В конце списка упаковывается беззнаковое целое `0`.

Например, чтобы упаковать список целых чисел, код может выглядеть так:

```python
import xdrlib
p = xdrlib.Packer()
p.pack_list([1, 2, 3], p.pack_int)
```

#### `[xdrlib.Packer.pack_farray]Packer.pack_farray(n, array, pack_item)`

Упаковывает список фиксированной длины (

*array*

) однородных элементов.

*n*

– длина списка; она

*не*

упаковывается в буфер, но возникает исключение

[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)

, если

`len(array)`

не равно

*n*

. Как и выше,

*pack\_item*

– это функция, используемая для упаковки каждого элемента.

#### `[xdrlib.Packer.pack_array]Packer.pack_array(list, pack_item)`

Упаковывает список переменной длины

*list*

однородных элементов. Сначала длина списка упаковывается как беззнаковое целое, затем каждый элемент упаковывается, как в

[`pack_farray()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer.pack_farray)

выше.

## Объекты Unpacker

Класс [`Unpacker`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker) предоставляет следующие методы:

#### `[xdrlib.Unpacker.reset]Unpacker.reset(data)`

Сбрасывает строковый буфер с указанными

*данными*

.

#### `[xdrlib.Unpacker.get_position]Unpacker.get_position()`

Возвращает текущую позицию распаковки в буфере данных.

#### `[xdrlib.Unpacker.set_position]Unpacker.set_position(position)`

Устанавливает позицию распаковки буфера данных в

*position*

. Следует с осторожностью использовать

[`get_position()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.get_position)

и

[`set_position()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.set_position)

.

#### `[xdrlib.Unpacker.get_buffer]Unpacker.get_buffer()`

Возвращает текущий буфер данных распаковки в виде строки.

#### `[xdrlib.Unpacker.done]Unpacker.done()`

Указывает на завершение распаковки. Возбуждает исключение

[`Error`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Error)

, если все данные ещё не распакованы.

Кроме того, каждый тип данных, который можно упаковать с помощью [`Packer`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer), можно распаковать с помощью [`Unpacker`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker). Методы распаковки имеют вид `unpack_type()` и не принимают аргументов. Они возвращают распакованный объект.

#### `[xdrlib.Unpacker.unpack_float]Unpacker.unpack_float()`

Распаковывает число с плавающей точкой одинарной точности.

#### `[xdrlib.Unpacker.unpack_double]Unpacker.unpack_double()`

Распаковывает число с плавающей запятой двойной точности, аналогично

[`unpack_float()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_float)

.

Кроме того, следующие методы распаковывают строки, байты и непрозрачные данные:

#### `[xdrlib.Unpacker.unpack_fstring]Unpacker.unpack_fstring(n)`

Распаковывает и возвращает строку фиксированной длины.

*n*

– это ожидаемое количество символов. Предполагается дополнение нулевыми байтами для гарантированного выравнивания до 4 байт.

#### `[xdrlib.Unpacker.unpack_fopaque]Unpacker.unpack_fopaque(n)`

Распаковывает и возвращает поток непрозрачных данных фиксированной длины, аналогично

[`unpack_fstring()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_fstring)

.

#### `[xdrlib.Unpacker.unpack_string]Unpacker.unpack_string()`

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

[`unpack_fstring()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_fstring)

.

#### `[xdrlib.Unpacker.unpack_opaque]Unpacker.unpack_opaque()`

Распаковывает и возвращает строку непрозрачных данных переменной длины, аналогично

[`unpack_string()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_string)

.

#### `[xdrlib.Unpacker.unpack_bytes]Unpacker.unpack_bytes()`

Распаковывает и возвращает поток байтов переменной длины, аналогично

[`unpack_string()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_string)

.

Следующие методы поддерживают распаковку массивов и списков:

#### `[xdrlib.Unpacker.unpack_list]Unpacker.unpack_list(unpack_item)`

Распаковывает и возвращает список однородных элементов. Список распаковывается поэлементно: сначала распаковывается беззнаковый целочисленный флаг. Если флаг равен

`1`

, то элемент распаковывается и добавляется в список. Флаг

`0`

обозначает конец списка.

*unpack\_item*

– это функция, которая вызывается для распаковки элементов.

#### `[xdrlib.Unpacker.unpack_farray]Unpacker.unpack_farray(n, unpack_item)`

Распаковывает и возвращает (в виде списка) массив фиксированной длины из однородных элементов.

*n*

– это количество элементов списка, которое ожидается в буфере. Как и выше,

*unpack\_item*

– это функция, используемая для распаковки каждого элемента.

#### `[xdrlib.Unpacker.unpack_array]Unpacker.unpack_array(unpack_item)`

Распаковывает и возвращает список

*list*

переменной длины из однородных элементов. Сначала длина списка распаковывается как беззнаковое целое, затем каждый элемент распаковывается, как в

[`unpack_farray()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_farray)

выше.

## Исключения

Исключения в этом модуле реализованы как экземпляры классов:

#### `[xdrlib.Error]exception xdrlib.Error`

Базовый класс исключений.

[`Error`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Error)

имеет единственный открытый атрибут

`msg`

, содержащий описание ошибки.

#### `[xdrlib.ConversionError]exception xdrlib.ConversionError`

Класс, производный от

[`Error`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Error)

. Не содержит дополнительных переменных экземпляра.

Вот пример того, как можно перехватить одно из этих исключений:

```python
import xdrlib
p = xdrlib.Packer()
try:
    p.pack_double(8.01)
except xdrlib.ConversionError as instance:
    print('packing the double failed:', instance.msg)
```
