Документация Python неофициальный перевод

xdrlib.md

365 строк · 14.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.0/library/xdrlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `xdrlib` – Кодирование и декодирование данных XDR89Модуль `xdrlib` реализует стандарт внешнего представления данных (External Data Representation), как описано в [**RFC 1014**](https://python-all.ru/3.0/library/xdrlib.html) (Sun Microsystems, Inc., июнь 1987 г.). Он поддерживает большинство типов данных, описанных в этом RFC.1011Модуль `xdrlib` определяет два класса: один для упаковки переменных в представление XDR, и другой для распаковки из представления XDR. Также определены dва класса исключений.1213#### `[xdrlib.Packer]class xdrlib.Packer`1415[`Packer`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer)1617– это класс для упаковки данных в представление XDR. Класс1819[`Packer`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer)2021создаётся без аргументов.2223#### `[xdrlib.Unpacker]class xdrlib.Unpacker(data)`2425`Unpacker`2627– это дополнительный класс, который распаковывает значения данных XDR из строкового буфера. Входной буфер передаётся как2829*data*3031.3233> **См. также**34>35> **[**RFC 1014**](https://python-all.ru/3.0/library/xdrlib.html) – XDR: стандарт внешнего представления данных**36>37> Этот RFC определял кодирование данных XDR на момент написания этого модуля. По-видимому, он устарел и заменён38>39> [**RFC 1832**](https://python-all.ru/3.0/library/xdrlib.html)40>41> .42>43> **[**RFC 1832**](https://python-all.ru/3.0/library/xdrlib.html) – XDR: стандарт внешнего представления данных**44>45> Более новый RFC, содержащий исправленное определение XDR.4647## Объекты Packer4849Экземпляры [`Packer`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer) имеют следующие методы:5051#### `[xdrlib.Packer.get_buffer]Packer.get_buffer()`5253Возвращает текущий буфер упаковки в виде строки.5455#### `[xdrlib.Packer.reset]Packer.reset()`5657Сбрасывает буфер упаковки в пустую строку.5859В целом, можно упаковать любой из наиболее распространённых типов данных XDR, вызвав соответствующий метод `pack_type()`. Каждый метод принимает один аргумент – упаковываемое значение. Поддерживаются следующие простые методы упаковки типов данных: `pack_uint()`, `pack_int()`, `pack_enum()`, `pack_bool()`, `pack_uhyper()` и `pack_hyper()`.6061#### `[xdrlib.Packer.pack_float]Packer.pack_float(value)`6263Упаковывает число с плавающей запятой одинарной точности6465*value*6667.6869#### `[xdrlib.Packer.pack_double]Packer.pack_double(value)`7071Упаковывает число с плавающей запятой двойной точности7273*value*7475.7677Следующие методы поддерживают упаковку строк, байтов и непрозрачных данных:7879#### `[xdrlib.Packer.pack_fstring]Packer.pack_fstring(n, s)`8081Упаковывает строку фиксированной длины8283*s*8485.8687*n*8889– это длина строки, но она9091*не*9293упаковывается в буфер данных. При необходимости строка дополняется нулевыми байтами для обеспечения выравнивания на 4 байта.9495#### `[xdrlib.Packer.pack_fopaque]Packer.pack_fopaque(n, data)`9697Упаковывает поток непрозрачных данных фиксированной длины, аналогично9899[`pack_fstring()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer.pack_fstring)100101.102103#### `[xdrlib.Packer.pack_string]Packer.pack_string(s)`104105Упаковывает строку переменной длины106107*s*108109. Сначала длина строки упаковывается как беззнаковое целое, затем строковые данные упаковываются с помощью110111[`pack_fstring()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer.pack_fstring)112113.114115#### `[xdrlib.Packer.pack_opaque]Packer.pack_opaque(data)`116117Упаковывает строку непрозрачных данных переменной длины, аналогично118119[`pack_string()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer.pack_string)120121.122123#### `[xdrlib.Packer.pack_bytes]Packer.pack_bytes(bytes)`124125Упаковывает поток байтов переменной длины, аналогично126127[`pack_string()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer.pack_string)128129.130131Следующие методы поддерживают упаковку массивов и списков:132133#### `[xdrlib.Packer.pack_list]Packer.pack_list(list, pack_item)`134135Упаковывает *список* однородных элементов. Этот метод полезен для списков с неопределённым размером; т.е. размер становится известен только после обхода всего списка. Для каждого элемента списка сначала упаковывается беззнаковое целое `1`, затем значение данных из списка. *pack\_item* – это функция, которая вызывается для упаковки отдельного элемента. В конце списка упаковывается беззнаковое целое `0`.136137Например, чтобы упаковать список целых чисел, код может выглядеть так:138139```python140import xdrlib141p = xdrlib.Packer()142p.pack_list([1, 2, 3], p.pack_int)143```144145#### `[xdrlib.Packer.pack_farray]Packer.pack_farray(n, array, pack_item)`146147Упаковывает список фиксированной длины (148149*array*150151) однородных элементов.152153*n*154155– длина списка; она156157*не*158159упаковывается в буфер, но возникает исключение160161[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)162163, если164165`len(array)`166167не равно168169*n*170171. Как и выше,172173*pack\_item*174175– это функция, используемая для упаковки каждого элемента.176177#### `[xdrlib.Packer.pack_array]Packer.pack_array(list, pack_item)`178179Упаковывает список переменной длины180181*list*182183однородных элементов. Сначала длина списка упаковывается как беззнаковое целое, затем каждый элемент упаковывается, как в184185[`pack_farray()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Packer.pack_farray)186187выше.188189## Объекты Unpacker190191Класс [`Unpacker`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker) предоставляет следующие методы:192193#### `[xdrlib.Unpacker.reset]Unpacker.reset(data)`194195Сбрасывает строковый буфер с указанными196197*данными*198199.200201#### `[xdrlib.Unpacker.get_position]Unpacker.get_position()`202203Возвращает текущую позицию распаковки в буфере данных.204205#### `[xdrlib.Unpacker.set_position]Unpacker.set_position(position)`206207Устанавливает позицию распаковки буфера данных в208209*position*210211. Следует с осторожностью использовать212213[`get_position()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.get_position)214215и216217[`set_position()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.set_position)218219.220221#### `[xdrlib.Unpacker.get_buffer]Unpacker.get_buffer()`222223Возвращает текущий буфер данных распаковки в виде строки.224225#### `[xdrlib.Unpacker.done]Unpacker.done()`226227Указывает на завершение распаковки. Возбуждает исключение228229[`Error`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Error)230231, если все данные ещё не распакованы.232233Кроме того, каждый тип данных, который можно упаковать с помощью [`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()` и не принимают аргументов. Они возвращают распакованный объект.234235#### `[xdrlib.Unpacker.unpack_float]Unpacker.unpack_float()`236237Распаковывает число с плавающей точкой одинарной точности.238239#### `[xdrlib.Unpacker.unpack_double]Unpacker.unpack_double()`240241Распаковывает число с плавающей запятой двойной точности, аналогично242243[`unpack_float()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_float)244245.246247Кроме того, следующие методы распаковывают строки, байты и непрозрачные данные:248249#### `[xdrlib.Unpacker.unpack_fstring]Unpacker.unpack_fstring(n)`250251Распаковывает и возвращает строку фиксированной длины.252253*n*254255– это ожидаемое количество символов. Предполагается дополнение нулевыми байтами для гарантированного выравнивания до 4 байт.256257#### `[xdrlib.Unpacker.unpack_fopaque]Unpacker.unpack_fopaque(n)`258259Распаковывает и возвращает поток непрозрачных данных фиксированной длины, аналогично260261[`unpack_fstring()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_fstring)262263.264265#### `[xdrlib.Unpacker.unpack_string]Unpacker.unpack_string()`266267Распаковывает и возвращает строку переменной длины. Сначала длина строки распаковывается как беззнаковое целое, затем данные строки распаковываются с помощью268269[`unpack_fstring()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_fstring)270271.272273#### `[xdrlib.Unpacker.unpack_opaque]Unpacker.unpack_opaque()`274275Распаковывает и возвращает строку непрозрачных данных переменной длины, аналогично276277[`unpack_string()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_string)278279.280281#### `[xdrlib.Unpacker.unpack_bytes]Unpacker.unpack_bytes()`282283Распаковывает и возвращает поток байтов переменной длины, аналогично284285[`unpack_string()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_string)286287.288289Следующие методы поддерживают распаковку массивов и списков:290291#### `[xdrlib.Unpacker.unpack_list]Unpacker.unpack_list(unpack_item)`292293Распаковывает и возвращает список однородных элементов. Список распаковывается поэлементно: сначала распаковывается беззнаковый целочисленный флаг. Если флаг равен294295`1`296297, то элемент распаковывается и добавляется в список. Флаг298299`0`300301обозначает конец списка.302303*unpack\_item*304305– это функция, которая вызывается для распаковки элементов.306307#### `[xdrlib.Unpacker.unpack_farray]Unpacker.unpack_farray(n, unpack_item)`308309Распаковывает и возвращает (в виде списка) массив фиксированной длины из однородных элементов.310311*n*312313– это количество элементов списка, которое ожидается в буфере. Как и выше,314315*unpack\_item*316317– это функция, используемая для распаковки каждого элемента.318319#### `[xdrlib.Unpacker.unpack_array]Unpacker.unpack_array(unpack_item)`320321Распаковывает и возвращает список322323*list*324325переменной длины из однородных элементов. Сначала длина списка распаковывается как беззнаковое целое, затем каждый элемент распаковывается, как в326327[`unpack_farray()`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Unpacker.unpack_farray)328329выше.330331## Исключения332333Исключения в этом модуле реализованы как экземпляры классов:334335#### `[xdrlib.Error]exception xdrlib.Error`336337Базовый класс исключений.338339[`Error`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Error)340341имеет единственный открытый атрибут342343`msg`344345, содержащий описание ошибки.346347#### `[xdrlib.ConversionError]exception xdrlib.ConversionError`348349Класс, производный от350351[`Error`](https://python-all.ru/3.0/library/xdrlib.html#xdrlib.Error)352353. Не содержит дополнительных переменных экземпляра.354355Вот пример того, как можно перехватить одно из этих исключений:356357```python358import xdrlib359p = xdrlib.Packer()360try:361    p.pack_double(8.01)362except xdrlib.ConversionError as instance:363    print('packing the double failed:', instance.msg)364```365