xdrlib — 编码和解码 XDR 数据

源代码: Lib/xdrlib.py

自版本 3.11 起已弃用,将在版本 3.13 中移除: xdrlib 模块已弃用(有关详细信息,请参阅 PEP 594)。


xdrlib 模块支持外部数据表示标准,如 Sun Microsystems, Inc. 于 1987 年 6 月编写的 RFC 1014 中所述。它支持 RFC 中描述的大多数数据类型。

xdrlib 模块定义了两个类,一个用于将变量打包成 XDR 表示形式,另一个用于从 XDR 表示形式解包。还有两个异常类。

class xdrlib.Packer

Packer 是用于将数据打包成 XDR 表示形式的类。Packer 类不带参数实例化。

class xdrlib.Unpacker(data)

Unpacker 是互补类,用于从字符串缓冲区解包 XDR 数据值。输入缓冲区指定为 data

另请参阅

RFC 1014 - XDR:外部数据表示标准

此 RFC 定义了在最初编写此模块时 XDR 的数据编码。它显然已被 RFC 1832 废弃。

RFC 1832 - XDR: 外部数据表示标准

提供 XDR 修订定义的较新的 RFC。

打包器对象

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)

打包一个固定长度字符串 sn 是字符串的长度,但它不会打包到数据缓冲区中。必要时,字符串将用空字节填充以保证 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是列表的长度;它不会打包到缓冲区中,但如果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 是用于解包每个元素的函数。

解包器。unpack_array(unpack_item)

解包并返回一个长度可变的同类项列表。首先,列表的长度被解包为一个无符号整数,然后每个元素被解包为 unpack_farray() 中的元素。

异常

此模块中的异常被编码为类实例

异常 xdrlib.Error

基础异常类。 Error 有一个公共属性 msg,其中包含错误描述。

异常 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)