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 із рядкового буфера. Вхідний буфер надається як дані.
Дивись також
Пакувальник об’єктів¶
Екземпляри 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)