xdrlib
— Кодирование и декодирование данных XDR¶
Исходный код: Lib/xdrlib.py
Утратил актуальность с версии 3.11, будет удален в версии 3.13: Модуль xdrlib
устарел (подробнее см. PEP 594).
Модуль xdrlib
поддерживает стандарт представления внешних данных, описанный в RFC 1014, написанный Sun Microsystems, Inc. Июнь 1987 г. Он поддерживает большинство типов данных, описанных в RFC.
Модуль xdrlib
определяет два класса, один из которых предназначен для упаковки переменных в XDR-представление, а другой - для распаковки из XDR-представления. Также есть два класса исключений.
- class xdrlib.Packer¶
Packer
- это класс для упаковки данных в XDR-представление. КлассPacker
создается без аргументов.
- class xdrlib.Unpacker(data)¶
Unpacker
- это дополнительный класс, который распаковывает значения данных XDR из строкового буфера. Входной буфер задается как data.
См.также
Упаковочные объекты¶
Packer
экземпляры имеют следующие методы:
- Packer.get_buffer()¶
Возвращает текущий буфер пакетов в виде строки.
- Packer.reset()¶
Сбрасывает значение буфера пакета в пустую строку.
В общем, вы можете упаковать любой из наиболее распространенных типов данных XDR, вызвав соответствующий метод pack_type()
. Каждый метод принимает единственный аргумент - значение для упаковки. Поддерживаются следующие простые методы упаковки типов данных: pack_uint()
, pack_int()
, pack_enum()
, pack_bool()
, pack_uhyper()
, и pack_hyper()
.
Следующие методы поддерживают упаковку строк, байтов и непрозрачных данных:
- Packer.pack_fstring(n, s)¶
Содержит строку фиксированной длины, s. n - это длина строки, но она не помещается в буфер данных. При необходимости строка дополняется нулевыми байтами для гарантированного выравнивания по 4 байта.
- Packer.pack_fopaque(n, data)¶
Упаковывает непрозрачный поток данных фиксированной длины, аналогично
pack_fstring()
.
- Packer.pack_string(s)¶
Содержит строку переменной длины, s. Длина строки сначала упаковывается как целое число без знака, затем данные строки упаковываются как
pack_fstring()
.
- Packer.pack_opaque(data)¶
Упаковывает непрозрачную строку данных переменной длины, аналогично
pack_string()
.
- Packer.pack_bytes(bytes)¶
Упаковывает поток байтов переменной длины, аналогично
pack_string()
.
Следующие методы поддерживают упаковку массивов и списков:
- Packer.pack_list(list, pack_item)¶
Объединяет список однородных элементов. Этот метод полезен для списков с неопределенным размером, т.е. размер недоступен, пока не пройден весь список. Для каждого элемента в списке сначала упаковывается целое число без знака
1
, за которым следует значение данных из списка. pack_item - это функция, которая вызывается для упаковки отдельного элемента. В конце списка помещается целое число без знака0
.Например, чтобы упаковать список целых чисел, код может выглядеть следующим образом:
import xdrlib p = xdrlib.Packer() p.pack_list([1, 2, 3], p.pack_int)
- Packer.pack_farray(n, array, pack_item)¶
Содержит список фиксированной длины (массив) из однородных элементов. n - это длина списка; он не упакован в буфер, но
ValueError
возникает исключение, еслиlen(array)
не равно n. Как указано выше, pack_item - это функция, используемая для упаковки каждого элемента.
- Packer.pack_array(list, pack_item)¶
Содержит список однородных элементов переменной длины. Сначала длина списка упаковывается как целое число без знака, затем каждый элемент упаковывается, как показано в
pack_farray()
выше.
Распаковывать объекты¶
Класс Unpacker
предлагает следующие методы:
- Unpacker.reset(data)¶
Сбрасывает строковый буфер с заданными данными.
- Unpacker.get_position()¶
Возвращает текущую позицию распаковки в буфере данных.
- Unpacker.set_position(position)¶
Устанавливает для позиции распаковки буфера данных значение position. Следует соблюдать осторожность при использовании
get_position()
иset_position()
.
- Unpacker.get_buffer()¶
Возвращает текущий буфер данных распаковки в виде строки.
- Unpacker.done()¶
Указывает на завершение распаковки. Вызывает исключение
Error
, если не все данные были распакованы.
Кроме того, каждый тип данных, который может быть упакован с помощью Packer
, может быть распакован с помощью Unpacker
. Методы распаковки имеют вид unpack_type()
и не принимают аргументов. Они возвращают распакованный объект.
- Unpacker.unpack_float()¶
Распаковывает число с плавающей запятой одинарной точности.
- Unpacker.unpack_double()¶
Распаковывает число с плавающей запятой двойной точности, аналогично
unpack_float()
.
Кроме того, следующие методы распаковывают строки, байты и непрозрачные данные:
- Unpacker.unpack_fstring(n)¶
Распаковывает и возвращает строку фиксированной длины. n - ожидаемое количество символов. Предполагается заполнение нулевыми байтами для гарантированного выравнивания по 4 байтам.
- Unpacker.unpack_fopaque(n)¶
Распаковывает и возвращает непрозрачный поток данных фиксированной длины, аналогично
unpack_fstring()
.
- Unpacker.unpack_string()¶
Распаковывает и возвращает строку переменной длины. Длина строки сначала распаковывается как целое число без знака, затем данные строки распаковываются как
unpack_fstring()
.
- Unpacker.unpack_opaque()¶
Распаковывает и возвращает непрозрачную строку данных переменной длины, аналогично
unpack_string()
.
- Unpacker.unpack_bytes()¶
Распаковывает и возвращает поток байтов переменной длины, аналогично
unpack_string()
.
Следующие методы поддерживают распаковку массивов и списков:
- Unpacker.unpack_list(unpack_item)¶
Распаковывает и возвращает список однородных элементов. Список распаковывается по одному элементу за раз, сначала распаковывается флаг целого числа без знака. Если флаг равен
1
, то элемент распаковывается и добавляется в список. Флаг0
указывает на конец списка. unpack_item - это функция, которая вызывается для распаковки элементов.
- Unpacker.unpack_farray(n, unpack_item)¶
Распаковывает и возвращает (в виде списка) массив однородных элементов фиксированной длины. n - количество элементов списка, ожидаемых в буфере. Как указано выше, unpack_item - это функция, используемая для распаковки каждого элемента.
- Unpacker.unpack_array(unpack_item)¶
Распаковывает и возвращает список однородных элементов переменной длины. Сначала длина списка распаковывается как целое число без знака, затем каждый элемент распаковывается, как показано в
unpack_farray()
выше.
Исключения¶
Исключения в этом модуле кодируются как экземпляры класса:
- exception xdrlib.Error¶
Базовый класс исключений.
Error
имеет единственный открытый атрибутmsg
, содержащий описание ошибки.
- exception xdrlib.ConversionError¶
Класс, производный от
Error
. Не содержит дополнительных переменных экземпляра.
Класс, производный от . Не содержит дополнительных переменных экземпляра.
import xdrlib
p = xdrlib.Packer()
try:
p.pack_double(8.01)
except xdrlib.ConversionError as instance:
print('packing the double failed:', instance.msg)