xdrlib
— Кодирование и декодирование данных XDR¶
Исходный код: Lib/xdrlib.py.
Модуль 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_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)