Skip to main content

14.4. xdrlib —编码和解码XDR数据

源代码: Lib/xdrlib.py


xdrlib 模块支持外部数据表示标准,如 RFC 1014 中描述的,由Sun Microsystems,Inc。于1987年6月编写。它支持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:外部数据表示标准

更新的RFC,提供了XDR的修订定义。

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)

包装一个固定长度的字符串,sn 是字符串的长度,但它是 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()

以字符串形式返回当前的解压数据缓冲区。

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)

解包并返回均匀项的可变长度 list。首先,列表的长度被解包为无符号整数,然后每个元素被解包,如在上面的 unpack_farray() 中。

14.4.3. 例外

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

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)