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.

См.также

RFC 1014 - XDR: Стандарт представления внешних данных

Этот RFC определил кодировку данных, которая на момент написания этого модуля была XDR. По-видимому, она устарела из-за RFC 1832.

RFC 1832 - XDR: Стандарт представления внешних данных

Более новый RFC, содержащий пересмотренное определение XDR.

Упаковочные объекты

Packer экземпляры имеют следующие методы:

Packer.get_buffer()

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

Packer.reset()

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

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

Packer.pack_float(value)

Содержит значение числа с плавающей запятой одинарной точности *.

Packer.pack_double(value)

Содержит значение числа с плавающей запятой двойной точности *.

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

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)
Вернуться на верх