14.4. xdrlib
—编码和解码XDR数据¶
源代码: Lib/xdrlib.py
xdrlib
模块支持外部数据表示标准,如 RFC 1014 中描述的,由Sun Microsystems,Inc。于1987年6月编写。它支持RFC中描述的大多数数据类型。
xdrlib
模块定义了两个类,一个用于将变量打包为XDR表示,另一个用于从XDR表示解包。还有两个异常类。
-
class
xdrlib.
Unpacker
(data)¶ Unpacker
是从字符串缓冲区解包XDR数据值的互补类。输入缓冲区为 data。
参见
14.4.1. 包装器对象¶
Packer
实例有以下方法:
-
Packer.
get_buffer
()¶ 以字符串形式返回当前包缓冲区。
-
Packer.
reset
()¶ 将包缓冲区重置为空字符串。
一般来说,您可以通过调用适当的 pack_type()
方法打包任何最常见的XDR数据类型。每个方法都需要一个参数,即要打包的值。支持以下简单数据类型打包方法: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 是字符串的长度,但它是 not 打包到数据缓冲区。如果需要,字符串用空字节填充以保证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)¶ 包装均质物品的 list。此方法对于具有不确定大小的列表很有用;即,在整个列表已经走动之前,该大小是不可用的。对于列表中的每个项目,首先打包无符号整数
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)¶ 包装均匀项目的固定长度列表(array)。 n 是列表的长度;它是 not 打包到缓冲区中,但是如果
len(array)
不等于 n,则引发ValueError
异常。如上所述,pack_item 是用于包装每个元素的函数。
-
Packer.
pack_array
(list, pack_item)¶ 包装均匀项目的可变长度 list。首先,列表的长度打包为无符号整数,然后每个元素打包为上面的
pack_farray()
。
14.4.2. 解压缩对象¶
Unpacker
类提供以下方法:
-
Unpacker.
reset
(data)¶ 使用给定的 data 重置字符串缓冲区。
-
Unpacker.
get_position
()¶ 返回数据缓冲区中当前的解压缩位置。
-
Unpacker.
set_position
(position)¶ 将数据缓冲区解包位置设置为 position。你应该注意使用
get_position()
和set_position()
。
-
Unpacker.
get_buffer
()¶ 以字符串形式返回当前的解压数据缓冲区。
此外,可以用 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)¶ 解包并返回均匀项的可变长度 list。首先,列表的长度被解包为无符号整数,然后每个元素被解包,如在上面的
unpack_farray()
中。
14.4.3. 例外¶
此模块中的异常被编码为类实例:
下面是一个如何捕获这些异常的示例:
import xdrlib
p = xdrlib.Packer()
try:
p.pack_double(8.01)
except xdrlib.ConversionError as instance:
print('packing the double failed:', instance.msg)