xdrlib --- 編碼與解碼 XDR 數據?

源代碼: Lib/xdrlib.py

Deprecated since version 3.11, will be removed in version 3.13: The xdrlib module is deprecated (see PEP 594 for details).


xdrlib 模塊為外部數據表示標準提供支持,該標準的描述見 RFC 1014,由 Sun Microsystems, Inc. 在 1987 年 6 月撰寫。 它支持該 RFC 中描述的大部分數據類型。

xdrlib 模塊定義了兩個類,一個用于將變量打包為 XDR 表示形式,另一個用于從 XDR 表示形式解包。 此外還有兩個異常類。

class xdrlib.Packer?

Packer 是用于將數據打包為 XDR 表示形式的類。 Packer 類的實例化不附帶參數。

class xdrlib.Unpacker(data)?

Unpacker 是用于相應地從字符串緩沖區(qū)解包 XDR 數據值的類。 輸入緩沖區(qū)將作為 data 給出。

參見

RFC 1014 - XDR: 外部數據表示標準

這個 RFC 定義了最初編寫此模塊時 XDR 所用的數據編碼格式。 顯然它已被 RFC 1832 所淘汰。

RFC 1832 - XDR: 外部數據表示標準

更新的 RFC,它提供了經修訂的 XDR 定義。

Packer 對象?

Packer 實例具有下列方法:

Packer.get_buffer()?

將當前打包緩沖區(qū)以字符串的形式返回。

Packer.reset()?

將打包緩沖區(qū)重置為空字符串。

總體來說,你可以通過調用適當的 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。

以下方法支持打包字符串、字節(jié)串以及不透明數據。

Packer.pack_fstring(n, s)?

打包固定長度字符串 s。 n 為字符串的長度,但它 不會 被打包進數據緩沖區(qū)。 如有必要字符串會以空字節(jié)串填充以保證 4 字節(jié)對齊。

Packer.pack_fopaque(n, data)?

打包固定長度不透明數據流,類似于 pack_fstring()

Packer.pack_string(s)?

打包可變長度字符串 s。 先將字符串的長度打包為無符號整數,再用 pack_fstring() 來打包字符串數據。

Packer.pack_opaque(data)?

打包可變長度不透明數據流,類似于 pack_string()。

Packer.pack_bytes(bytes)?

打包可變長度字節(jié)流,類似于 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 為列表長度;它 不會 被打包到緩沖區(qū),但是如果 len(array) 不等于 n 則會引發(fā) ValueError。 如上所述,pack_item 是在打包每個元素時要使用的函數。

Packer.pack_array(list, pack_item)?

打包由同質條目構成的可變長度 list。 先將列表的長度打包為無符號整數,再像上面的 pack_farray() 一樣打包每個元素。

Unpacker 對象?

Unpacker 類提供以下方法:

Unpacker.reset(data)?

使用給定的 data 重置字符串緩沖區(qū)。

Unpacker.get_position()?

返回數據緩沖區(qū)中的當前解包位置。

Unpacker.set_position(position)?

將數據緩沖區(qū)的解包位置設為 position。 你應當小心使用 get_position()set_position()。

Unpacker.get_buffer()?

將當前解包數據緩沖區(qū)以字符串的形式返回。

Unpacker.done()?

表明解包完成。 如果數據沒有全部完成解包則會引發(fā) Error 異常。

此外,每種可通過 Packer 打包的數據類型都可通過 Unpacker 來解包。 解包方法的形式為 unpack_type(),并且不接受任何參數。 該方法將返回解包后的對象。

Unpacker.unpack_float()?

解包單精度浮點數。

Unpacker.unpack_double()?

解包雙精度浮點數,類似于 unpack_float()。

此外,以下方法可用來解包字符串、字節(jié)串以及不透明數據:

Unpacker.unpack_fstring(n)?

解包并返回固定長度字符串。 n 為期望的字符數量。 會預設以空字節(jié)串填充以保證 4 字節(jié)對齊。

Unpacker.unpack_fopaque(n)?

解包并返回固定長度數據流,類似于 unpack_fstring()。

Unpacker.unpack_string()?

解包并返回可變長度字符串。 先將字符串的長度解包為無符號整數,再用 unpack_fstring() 來解包字符串數據。

Unpacker.unpack_opaque()?

解包并返回可變長度不透明數據流,類似于 unpack_string()。

Unpacker.unpack_bytes()?

解包并返回可變長度字節(jié)流,類似于 unpack_string()。

下列方法支持解包數組和列表:

Unpacker.unpack_list(unpack_item)?

解包并返回同質條目的列表。 該列表每次解包一個元素,先解包一個無符號整數旗標。 如果旗標為 1,則解包條目并將其添加到列表。 旗標為 0 表明列表結束。 unpack_item 為在解包條目時調用的函數。

Unpacker.unpack_farray(n, unpack_item)?

解包并(以列表形式)返回由同質條目構成的固定長度數組。 n 為期望的緩沖區(qū)內列表元素數量。 如上所述,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)