xdrlib
xdrlib - 对XDR数据进行编码和解码
源代码:
Lib / xdrlib.py
xdrlib
模块支持外部数据表示标准,如Sun Microsystems,Inc.于1987年6月编写的RFC 1014中
所述。它支持RFC中描述的大部分数据类型。
xdrlib
模块定义了两个类,一个用于将变量打包到XDR表示中,另一个用于从XDR表示中解压缩。还有两个异常类。
class xdrlib.Packer
Packer
是将数据打包到XDR表示中的类。将Packer
类实例化不带任何参数。
class xdrlib.Unpacker(data)
Unpacker
是从字符串缓冲区中解压XDR数据
值的补充类。输入缓冲区是作为数据
给出的。
另请参阅
RFC 1014
- XDR:外部数据表示标准此RFC定义了在最初编写此模块时XDR的数据编码。RFC 1832
显然已经过时了。 RFC 1832
- XDR:外部数据表示标准较新的RFC,提供XDR的修订定义。
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)
打包单精度浮点数值
。
Packer.pack_double(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)
打包同质项目的固定长度列表(数组
)。n
是列表的长度; 它没有
打包到缓冲区中,但是ValueError
如果len(array)
不等于n,
则会引发异常。如上所述,pack_item
是用于打包每个元素的函数。
Packer.pack_array(list, pack_item)
打包同义项目的可变长度列表
。首先,列表
的长度被打包为一个无符号整数,然后每个元素按pack_farray()
上面的方式打包。
2.解包器对象
Unpacker
课程提供以下方法:
Unpacker.reset(data)
用给定的数据
重新设置字符串缓冲区。
Unpacker.get_position()
返回数据缓冲区中的当前解包位置。
Unpacker.set_position(position)
将数据缓冲区解包位置
设置为位置
。你应该小心使用get_position()
和set_position()
。
Unpacker.get_buffer()
以字符串形式返回当前的解包数据缓冲区。
Unpacker.done()
表示解包完成。Error
如果所有数据都未解压,则引发异常。
另外,可以用a打包的每种数据类型都可以用a 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()
上面那样解压缩每个元素。
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