xdrlib —XDRデータをエンコードおよびデコードします
ソースコード: :source: `Lib / xdrlib.py`
xdrlib モジュールは、Sun Microsystems、Inc。によって作成された RFC 1014 で説明されているように、外部データ表現標準をサポートします。 1987年6月。 RFCで説明されているほとんどのデータ型をサポートします。
xdrlib モジュールは、2つのクラスを定義します。1つは変数をXDR表現にパックするためのもので、もう1つはXDR表現からアンパックするためのものです。 2つの例外クラスもあります。
- 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()
メソッドを呼び出すことにより、最も一般的なXDRデータ型のいずれかをパックできます。 各メソッドは、パックする値である単一の引数を取ります。 次の単純なデータ型のパッキング方法がサポートされています:pack_uint()
、pack_int()
、pack_enum()
、pack_bool()
、pack_uhyper()
、および [ X125X]。
- Packer.pack_float(value)
- 単精度浮動小数点数値をパックします。
- Packer.pack_double(value)
- 倍精度浮動小数点数値をパックします。
次のメソッドは、文字列、バイト、不透明(OPAQUE)データのパッキングをサポートしています。
- Packer.pack_fstring(n, s)
- 固定長の文字列 s をパックします。 n は文字列の長さですが、データバッファにパックされていません。 4バイトのアラインメントを保証するために、必要に応じて文字列にnullバイトが埋め込まれます。
- Packer.pack_fopaque(n, data)
- pack_fstring()と同様に、固定長の不透明(OPAQUE)ストリームをパックします。
- Packer.pack_string(s)
- 可変長文字列 s をパックします。 文字列の長さは最初に符号なし整数としてパックされ、次に文字列データは pack_fstring()でパックされます。
- Packer.pack_opaque(data)
- pack_string()と同様に、可変長の不透明(OPAQUE)文字列をパックします。
- Packer.pack_bytes(bytes)
- pack_string()と同様に、可変長のバイトストリームをパックします。
次のメソッドは、配列とリストのパッキングをサポートしています。
- Packer.pack_list(list, pack_item)
同種のアイテムのリストをパックします。 この方法は、サイズが不確定なリストに役立ちます。 NS リスト全体がウォークされるまで、サイズは利用できません。 リスト内の各項目について、符号なし整数
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 クラスは、次のメソッドを提供します。
- Unpacker.reset(data)
- 指定されたデータで文字列バッファをリセットします。
- Unpacker.get_position()
- データバッファ内の現在の解凍位置を返します。
- Unpacker.set_position(position)
- データバッファの解凍位置を位置に設定します。 get_position()および set_position()の使用には注意が必要です。
- Unpacker.get_buffer()
- 現在の解凍データバッファを文字列として返します。
- Unpacker.done()
- 開梱が完了したことを示します。 すべてのデータが解凍されていない場合、エラー例外が発生します。
さらに、 Packer でパックできるすべてのデータ型は、 Unpacker でアンパックできます。 解凍メソッドはunpack_type()
の形式であり、引数を取りません。 解凍されたオブジェクトを返します。
- Unpacker.unpack_float()
- 単精度浮動小数点数を解凍します。
- Unpacker.unpack_double()
- unpack_float()と同様に、倍精度浮動小数点数を解凍します。
さらに、次のメソッドは、文字列、バイト、および不透明(OPAQUE)データを解凍します。
- Unpacker.unpack_fstring(n)
- 固定長の文字列を解凍して返します。 n は、予想される文字数です。 保証された4バイトのアラインメントへのヌルバイトでのパディングが想定されます。
- Unpacker.unpack_fopaque(n)
- unpack_fstring()と同様に、固定長の不透明(OPAQUE)ストリームを解凍して返します。
- Unpacker.unpack_string()
- 可変長の文字列を解凍して返します。 文字列の長さは最初に符号なし整数として解凍され、次に文字列データは unpack_fstring()で解凍されます。
- Unpacker.unpack_opaque()
- unpack_string()と同様に、可変長の不透明(OPAQUE)データ文字列を解凍して返します。
- Unpacker.unpack_bytes()
- unpack_string()と同様に、可変長のバイトストリームをアンパックして返します。
次のメソッドは、配列とリストの解凍をサポートしています。
- Unpacker.unpack_list(unpack_item)
- 同種のアイテムのリストを解凍して返します。 リストは、最初に符号なし整数フラグをアンパックすることにより、一度に1つの要素をアンパックします。 フラグが
1
の場合、アイテムは解凍され、リストに追加されます。0
のフラグは、リストの終わりを示します。 unpack_item は、アイテムを解凍するために呼び出される関数です。
- Unpacker.unpack_farray(n, unpack_item)
- 同種のアイテムの固定長配列を解凍して(リストとして)返します。 n は、バッファーで予期されるリスト要素の数です。 上記のように、 unpack_item は、各要素を解凍するために使用される関数です。
- Unpacker.unpack_array(unpack_item)
- 同種のアイテムの可変長リストを解凍して返します。 最初に、リストの長さが符号なし整数としてアンパックされ、次に各要素が上記の unpack_farray()のようにアンパックされます。
例外
このモジュールの例外は、クラスインスタンスとしてコード化されています。
- exception xdrlib.Error
- 基本例外クラス。 エラーには、エラーの説明を含む単一のパブリック属性
msg
があります。
- exception xdrlib.ConversionError
- エラーから派生したクラス。 追加のインスタンス変数は含まれていません。
これらの例外の1つをキャッチする方法の例を次に示します。
import xdrlib
p = xdrlib.Packer()
try:
p.pack_double(8.01)
except xdrlib.ConversionError as instance:
print('packing the double failed:', instance.msg)