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
模塊為外部數據表示標準提供支持,該標準的描述見(jiàn) RFC 1014,由 Sun Microsystems, Inc. 在 1987 年 6 月撰寫(xiě)。 它支持該 RFC 中描述的大部分數據類(lèi)型。
xdrlib
模塊定義了兩個(gè)類(lèi),一個(gè)用于將變量打包為 XDR 表示形式,另一個(gè)用于從 XDR 表示形式解包。 此外還有兩個(gè)異常類(lèi)。
- class xdrlib.Unpacker(data)?
Unpacker
是用于相應地從字符串緩沖區解包 XDR 數據值的類(lèi)。 輸入緩沖區將作為 data 給出。
參見(jiàn)
Packer 對象?
Packer
實(shí)例具有下列方法:
- Packer.get_buffer()?
將當前打包緩沖區以字符串的形式返回。
- Packer.reset()?
將打包緩沖區重置為空字符串。
總體來(lái)說(shuō),你可以通過(guò)調用適當的 pack_type()
方法來(lái)打包任何最常見(jiàn)的 XDR 數據類(lèi)型。 每個(gè)方法都是接受單個(gè)參數,即要打包的值。 受支持的簡(jiǎn)單數據類(lèi)型打包方法如下: pack_uint()
, pack_int()
, pack_enum()
, pack_bool()
, pack_uhyper()
以及 pack_hyper()
。
- Packer.pack_float(value)?
打包單精度浮點(diǎn)數 value。
- Packer.pack_double(value)?
打包雙精度浮點(diǎn)數 value。
以下方法支持打包字符串、字節串以及不透明數據。
- Packer.pack_fstring(n, s)?
打包固定長(cháng)度字符串 s。 n 為字符串的長(cháng)度,但它 不會(huì ) 被打包進(jìn)數據緩沖區。 如有必要字符串會(huì )以空字節串填充以保證 4 字節對齊。
- Packer.pack_fopaque(n, data)?
打包固定長(cháng)度不透明數據流,類(lèi)似于
pack_fstring()
。
- Packer.pack_string(s)?
打包可變長(cháng)度字符串 s。 先將字符串的長(cháng)度打包為無(wú)符號整數,再用
pack_fstring()
來(lái)打包字符串數據。
- Packer.pack_opaque(data)?
打包可變長(cháng)度不透明數據流,類(lèi)似于
pack_string()
。
- Packer.pack_bytes(bytes)?
打包可變長(cháng)度字節流,類(lèi)似于
pack_string()
。
下列方法支持打包數組和列表:
- Packer.pack_list(list, pack_item)?
打包由同質(zhì)條目構成的 list。 此方法適用于不確定長(cháng)度的列表;即其長(cháng)度無(wú)法在遍歷整個(gè)列表之前獲知。 對于列表中的每個(gè)條目,先打包一個(gè)無(wú)符號整數
1
,再添加列表中數據的值。 pack_item 是在打包單個(gè)條目時(shí)要調用的函數。 在列表的末尾,會(huì )再打包一個(gè)無(wú)符號整數0
。例如,要打包一個(gè)整數列表,代碼看起來(lái)會(huì )是這樣:
import xdrlib p = xdrlib.Packer() p.pack_list([1, 2, 3], p.pack_int)
- Packer.pack_farray(n, array, pack_item)?
打包由同質(zhì)條目構成的固定長(cháng)度列表 (array)。 n 為列表長(cháng)度;它 不會(huì ) 被打包到緩沖區,但是如果
len(array)
不等于 n 則會(huì )引發(fā)ValueError
。 如上所述,pack_item 是在打包每個(gè)元素時(shí)要使用的函數。
- Packer.pack_array(list, pack_item)?
打包由同質(zhì)條目構成的可變長(cháng)度 list。 先將列表的長(cháng)度打包為無(wú)符號整數,再像上面的
pack_farray()
一樣打包每個(gè)元素。
Unpacker 對象?
Unpacker
類(lèi)提供以下方法:
- Unpacker.reset(data)?
使用給定的 data 重置字符串緩沖區。
- Unpacker.get_position()?
返回數據緩沖區中的當前解包位置。
- Unpacker.set_position(position)?
將數據緩沖區的解包位置設為 position。 你應當小心使用
get_position()
和set_position()
。
- Unpacker.get_buffer()?
將當前解包數據緩沖區以字符串的形式返回。
此外,每種可通過(guò) Packer
打包的數據類(lèi)型都可通過(guò) Unpacker
來(lái)解包。 解包方法的形式為 unpack_type()
,并且不接受任何參數。 該方法將返回解包后的對象。
- Unpacker.unpack_float()?
解包單精度浮點(diǎn)數。
- Unpacker.unpack_double()?
解包雙精度浮點(diǎn)數,類(lèi)似于
unpack_float()
。
此外,以下方法可用來(lái)解包字符串、字節串以及不透明數據:
- Unpacker.unpack_fstring(n)?
解包并返回固定長(cháng)度字符串。 n 為期望的字符數量。 會(huì )預設以空字節串填充以保證 4 字節對齊。
- Unpacker.unpack_fopaque(n)?
解包并返回固定長(cháng)度數據流,類(lèi)似于
unpack_fstring()
。
- Unpacker.unpack_string()?
解包并返回可變長(cháng)度字符串。 先將字符串的長(cháng)度解包為無(wú)符號整數,再用
unpack_fstring()
來(lái)解包字符串數據。
- Unpacker.unpack_opaque()?
解包并返回可變長(cháng)度不透明數據流,類(lèi)似于
unpack_string()
。
- Unpacker.unpack_bytes()?
解包并返回可變長(cháng)度字節流,類(lèi)似于
unpack_string()
。
下列方法支持解包數組和列表:
- Unpacker.unpack_list(unpack_item)?
解包并返回同質(zhì)條目的列表。 該列表每次解包一個(gè)元素,先解包一個(gè)無(wú)符號整數旗標。 如果旗標為
1
,則解包條目并將其添加到列表。 旗標為0
表明列表結束。 unpack_item 為在解包條目時(shí)調用的函數。
- Unpacker.unpack_farray(n, unpack_item)?
解包并(以列表形式)返回由同質(zhì)條目構成的固定長(cháng)度數組。 n 為期望的緩沖區內列表元素數量。 如上所述,unpack_item 是解包每個(gè)元素時(shí)要使用的函數。
- Unpacker.unpack_array(unpack_item)?
解包并返回由同質(zhì)條目構成的可變長(cháng)度 list。 先將列表的長(cháng)度解包為無(wú)符號整數,再像上面的
unpack_farray()
一樣解包每個(gè)元素。
異常?
此模塊中的異常會(huì )表示為類(lèi)實(shí)例代碼:
以下是一個(gè)應該如何捕獲這些異常的示例:
import xdrlib
p = xdrlib.Packer()
try:
p.pack_double(8.01)
except xdrlib.ConversionError as instance:
print('packing the double failed:', instance.msg)