Содержание страницы
xdrlib – Кодирование и декодирование XDR-данных¶xdrlib – Encode and decode XDR data
Исходный код: Lib/xdrlib.py
Модуль xdrlib реализует стандарт внешнего представления данных (External Data Representation Standard), описанный в 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 Objects
Экземпляры 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)¶ Упаковывает число с плавающей запятой одинарной точности value.
-
Packer.pack_double(value)¶ Упаковывает число с плавающей запятой двойной точности 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 Objects
Класс Unpacker предоставляет следующие методы:
-
Unpacker.reset(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()выше.
Исключения¶Exceptions
Исключения в этом модуле реализованы как экземпляры классов:
-
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)