python3從零學(xué)習(xí)-5.5.4、xdrlib — 編碼與解碼 XDR 數(shù)據(jù)

源代碼:?Lib/xdrlib.py

xdrlib?模塊為外部數(shù)據(jù)表示標(biāo)準(zhǔn)提供支持,該標(biāo)準(zhǔn)的描述見?RFC 1014,由 Sun Microsystems, Inc. 在 1987 年 6 月撰寫。 它支持該 RFC 中描述的大部分?jǐn)?shù)據(jù)類型。

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

class?xdrlib.Packer

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

class?xdrlib.Unpacker(data)

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

參見

RFC 1014?- XDR: 外部數(shù)據(jù)表示標(biāo)準(zhǔn)

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

RFC 1832?- XDR: 外部數(shù)據(jù)表示標(biāo)準(zhǔn)

更新的 RFC,它提供了經(jīng)修訂的 XDR 定義。

Packer 對象

Packer?實例具有下列方法:

Packer.get_buffer()

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

Packer.reset()

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

總體來說,你可以通過調(diào)用適當(dāng)?shù)?pack_type()?方法來打包任何最常見的 XDR 數(shù)據(jù)類型。 每個方法都是接受單個參數(shù),即要打包的值。 受支持的簡單數(shù)據(jù)類型打包方法如下:?pack_uint(),?pack_int(),?pack_enum(),?pack_bool(),?pack_uhyper()?以及?pack_hyper()。

Packer.pack_float(value)

打包單精度浮點數(shù)?value。

Packer.pack_double(value)

打包雙精度浮點數(shù)?value。

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

Packer.pack_fstring(n,?s)

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

Packer.pack_fopaque(n,?data)

打包固定長度不透明數(shù)據(jù)流,類似于?pack_fstring()。

Packer.pack_string(s)

打包可變長度字符串?s。 先將字符串的長度打包為無符號整數(shù),再用?pack_fstring()?來打包字符串?dāng)?shù)據(jù)。

Packer.pack_opaque(data)

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

Packer.pack_bytes(bytes)

打包可變長度字節(jié)流,類似于?pack_string()。

下列方法支持打包數(shù)組和列表:

Packer.pack_list(list,?pack_item)

打包由同質(zhì)條目構(gòu)成的?list。 此方法適用于不確定長度的列表;即其長度無法在遍歷整個列表之前獲知。 對于列表中的每個條目,先打包一個無符號整數(shù)?1,再添加列表中數(shù)據(jù)的值。?pack_item?是在打包單個條目時要調(diào)用的函數(shù)。 在列表的末尾,會再打包一個無符號整數(shù)?0.

例如,要打包一個整數(shù)列表,代碼看起來會是這樣:

importxdrlib

p=xdrlib.Packer()

p.pack_list([1,2,3], p.pack_int)

Packer.pack_farray(n,?array,?pack_item)

打包由同質(zhì)條目構(gòu)成的固定長度列表 (array)。?n?為列表長度;它?不會?被打包到緩沖區(qū),但是如果?len(array)?不等于?n?則會引發(fā)?ValueError。 如上所述,pack_item?是在打包每個元素時要使用的函數(shù)。

Packer.pack_array(list,?pack_item)

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

Unpacker 對象

Unpacker?類提供以下方法:

Unpacker.reset(data)

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

Unpacker.get_position()

返回數(shù)據(jù)緩沖區(qū)中的當(dāng)前解包位置。

Unpacker.set_position(position)

將數(shù)據(jù)緩沖區(qū)的解包位置設(shè)為?position。 你應(yīng)當(dāng)小心使用?get_position()?和?set_position()。

Unpacker.get_buffer()

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

Unpacker.done()

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

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

Unpacker.unpack_float()

解包單精度浮點數(shù)。

Unpacker.unpack_double()

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

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

Unpacker.unpack_fstring(n)

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

Unpacker.unpack_fopaque(n)

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

Unpacker.unpack_string()

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

Unpacker.unpack_opaque()

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

Unpacker.unpack_bytes()

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

下列方法支持解包數(shù)組和列表:

Unpacker.unpack_list(unpack_item)

解包并返回同質(zhì)條目的列表。 該列表每次解包一個元素,先解包一個無符號整數(shù)旗標(biāo)。 如果旗標(biāo)為?1,則解包條目并將其添加到列表。 旗標(biāo)為?0?表明列表結(jié)束。?unpack_item?為在解包條目時調(diào)用的函數(shù)。

Unpacker.unpack_farray(n,?unpack_item)

解包并(以列表形式)返回由同質(zhì)條目構(gòu)成的固定長度數(shù)組。?n?為期望的緩沖區(qū)內(nèi)列表元素數(shù)量。 如上所述,unpack_item?是解包每個元素時要使用的函數(shù)。

Unpacker.unpack_array(unpack_item)

解包并返回由同質(zhì)條目構(gòu)成的可變長度?list。 先將列表的長度解包為無符號整數(shù),再像上面的?unpack_farray()?一樣解包每個元素。

異常

此模塊中的異常會表示為類實例代碼:

exception?xdrlib.Error

基本異常類。?Error?具有一個公共屬性?msg,其中包含對錯誤的描述。

exception?xdrlib.ConversionError

從?Error?所派生的類。 不包含額外的實例變量。

以下是一個應(yīng)該如何捕獲這些異常的示例:

importxdrlib

p=xdrlib.Packer()

try:

??? p.pack_double(8.01)

exceptxdrlib.ConversionErrorasinstance:

???print('packing the double failed:', instance.msg)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容