xdrlib — Кодирование и декодирование данных XDR

Исходный код: Lib/xdrlib.py.

Не рекомендуется, начиная с версии 3.11: Модуль 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 не равен n, то возникает исключение len(array). Как и выше, pack_item - это функция, используемая для упаковки каждого элемента.

Packer.pack_array(list, pack_item)

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

Распаковщик объектов

Класс Unpacker предлагает следующие методы:

Unpacker.reset(data)

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

Unpacker.get_position()

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

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