On this page
13.5. xdrlib —编码和解码 XDR 数据
源代码: Lib/xdrlib.py
xdrlib模块支持 1987 年 6 月由 Sun Microsystems,Inc.编写的 RFC 1014中描述的外部数据表示标准。它支持 RFC 中描述的大多数数据类型。
xdrlib模块定义了两个类,一个用于将变量打包为 XDR 表示形式,另一个用于从 XDR 表示中解包。还有两个异常类。
类别
xdrlib.Packer类别
xdrlib.Unpacker(数据)Unpacker是互补类,用于从字符串缓冲区解包 XDR 数据值。Importing 缓冲区以* data *形式给出。
See also
13.5.1. 打包对象
Packer个实例具有以下方法:
Packer.get_buffer( )- 以字符串形式返回当前包缓冲区。
Packer.reset( )- 将包缓冲区重置为空字符串。
通常,可以pass调用适当的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 *是字符串的长度,但不打包在数据缓冲区中。如有必要,可使用空字节填充字符串,以确保 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 *)- 打包固定长度的同类项目列表(* array *)。 * n 是列表的长度;它没有被包装到缓冲区中,但是如果
len(array)不等于 n ,则会引发ValueError异常。如上所述, pack_item *是用于打包每个元素的函数。
- 打包固定长度的同类项目列表(* array *)。 * n 是列表的长度;它没有被包装到缓冲区中,但是如果
Packer.pack_array(* list , pack_item *)- 包装可变长度的同类项目列表。首先,将列表的长度打包为无符号整数,然后按照上面的pack_farray()打包每个元素。
13.5.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 *)- 解包并返回同类项目列表。pass首先解压缩无符号整数标志来一次将列表解压缩一个元素。如果标志是
1,那么将解压缩该项目并将其附加到列表中。标志0表示列表的末尾。 * unpack_item *是用来解压缩项目的函数。
- 解包并返回同类项目列表。pass首先解压缩无符号整数标志来一次将列表解压缩一个元素。如果标志是
Unpacker.unpack_farray(* n , unpack_item *)- 解包并返回固定长度的同类项目数组(作为列表)。 * n 是缓冲区中期望的列表元素数。如上所述, unpack_item *是用于解压缩每个元素的函数。
Unpacker.unpack_array(* unpack_item *)- 解压并返回可变长度的同类项目列表。首先,将列表的长度解压缩为无符号整数,然后像上面的unpack_farray()一样解压缩每个元素。
13.5.3. Exceptions
此模块中的异常编码为类实例:
exception
xdrlib.Error- 基本异常类。 Error具有单个公共属性
msg,其中包含错误的描述。
- 基本异常类。 Error具有单个公共属性
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