xdrlib — 编码和解码 XDR 数据 — Python 文档
来自菜鸟教程
Python/docs/3.10/library/xdrlib
xdrlib — 编码和解码 XDR 数据
xdrlib 模块支持外部数据表示标准,如 Sun Microsystems, Inc 编写的 RFC 1014 中所述。 1987 年 6 月。 它支持 RFC 中描述的大多数数据类型。
xdrlib 模块定义了两个类,一个用于将变量打包到 XDR 表示中,另一个用于从 XDR 表示中解包。 还有两个异常类。
- 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()
- 将包缓冲区重置为空字符串。
通常,您可以通过调用适当的 pack_type()
方法来打包任何最常见的 XDR 数据类型。 每个方法都接受一个参数,即要打包的值。 支持以下简单数据类型打包方法:pack_uint()
、pack_int()
、pack_enum()
、pack_bool()
、pack_uhyper()
和[ X125X]。
- Packer.pack_float(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)
打包一个 列表 同质项目。 此方法对于大小不确定的列表很有用; IE 在遍历整个列表之前,大小不可用。 对于列表中的每个项目,首先打包一个无符号整数
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)
- 打包同质项目的可变长度 列表 。 首先,列表的长度被打包为一个无符号整数,然后每个元素都被打包为上面的 pack_farray()。
解包对象
Unpacker 类提供以下方法:
- Unpacker.reset(data)
- 使用给定的 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)