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:外部数据表示标准

提供修改后的xdr定义的较新的RFC。

打包机对象

Packer 实例具有以下方法:

Packer.get_buffer()

以字符串形式返回当前包缓冲区。

Packer.reset()

将包缓冲区重置为空字符串。

通常,您可以通过调用适当的 pack_type() 方法。每个方法都接受一个参数,即要打包的值。支持以下简单的数据类型打包方法: 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 是字符串的长度,但它是 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)

封装A 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)

打包固定长度列表( 数组 )同质物品。 n 是列表的长度;它是 not 装进缓冲器,但是 ValueError 在以下情况下引发异常 len(array) 不等于 n . 如上, pack_item 是用于封装每个元素的函数。

Packer.pack_array(list, pack_item)

封装可变长度 list 同质物品。首先,列表的长度打包为无符号整数,然后每个元素打包为 pack_farray() 上面。

解包器对象

这个 Unpacker 类提供以下方法:

Unpacker.reset(data)

用给定的 data .

Unpacker.get_position()

返回数据缓冲区中的当前解包位置。

Unpacker.set_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() 上面。

例外情况

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

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)