xdrlib —编码和解码 XDR 数据

源代码: Lib/xdrlib.py


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

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

  • 类别 xdrlib. Packer

    • Packer是用于将数据打包为 XDR 表示形式的类。 Packer类的实例化没有参数。
  • 类别 xdrlib. Unpacker(数据)

    • Unpacker是互补类,用于从字符串缓冲区解包 XDR 数据值。Importing 缓冲区以* data *形式给出。

See also

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

  • 该 RFC 定义了数据的编码,该数据在最初编写该模块时为 XDR。显然已被 RFC 1832淘汰。

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

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

Packer Objects

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 *是用于打包每个元素的函数。
  • Packer. pack_array(* list pack_item *)

    • 包装可变长度的同类项目列表。首先,将列表的长度打包为无符号整数,然后按照上面的pack_farray()打包每个元素。

Unpacker Objects

Unpacker类提供以下方法:

  • Unpacker. reset(* data *)

    • 使用给定的* data *重置字符串缓冲区。
  • Unpacker. get_position ( )

    • 返回数据缓冲区中的当前拆包位置。
  • Unpacker. set_position(* position *)

  • Unpacker. get_buffer ( )

    • 以字符串形式返回当前的解压缩数据缓冲区。
  • Unpacker. done ( )

    • 表示解包完成。如果尚未解压缩所有数据,则引发Error异常。

此外,可以用Packer打包的每种数据类型都可以用Unpacker打包。解包方法的格式为unpack_type(),并且不带参数。他们返回解包的对象。

  • Unpacker. unpack_float ( )

    • 解压缩单精度浮点数。
  • Unpacker. unpack_double ( )

此外,以下方法还可以解包字符串,字节和不透明数据:

  • 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 *是用来解压缩项目的函数。
  • Unpacker. unpack_farray(* n unpack_item *)

    • 解包并返回固定长度的同类项目数组(作为列表)。 * n 是缓冲区中期望的列表元素数。如上所述, unpack_item *是用于解压缩每个元素的函数。
  • Unpacker. unpack_array(* unpack_item *)

    • 解压并返回可变长度的同类项目列表。首先,将列表的长度解压缩为无符号整数,然后像上面的unpack_farray()一样解压缩每个元素。

Exceptions

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

  • 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)