PythonのxdrlibモジュールでXDRデータをエンコード・デコードする方法
xdrlibモジュールは、外部データ表現(XDR:External Data Representation)のためのエンコーダー(Packer)とデコーダー(Unpacker)を提供するPythonの標準ライブラリです。XDRは、異なるシステムや外部ソース間でデータをやり取りする際に広く使われる標準フォーマットで、複雑なデータ構造を作成・転送するのに役立ちます。OSI参照モデルにおけるプレゼンテーション層に関連するサービスを提供するものとして知られています。
この記事では、xdrlibモジュールを使ってデータをパック(エンコード)およびアンパック(デコード)する方法を、具体的なサンプルコードとともに解説します。
サンプルコード
以下のプログラムでは、PackerクラスでリストのデータをXDR形式にパックし、その様子を確認しています。
import xdrlib # Packerオブジェクトを作成 p = xdrlib.Packer() print(type(p)) # リストを整数としてパック lst = [1, 2, 3] p.pack_list(lst, p.pack_int) print(p) # Unpackerオブジェクトを作成 u = xdrlib.Unpacker(p) print(type(u)) print(lst)
上記のコードを実行すると、次のような結果が得られます。
実行結果
<class 'xdrlib.Packer'> <xdrlib.Packer object at 0x000002272F3D6FD0> [1, 2, 3]
コードのポイント
- xdrlib.Packer():XDR形式でデータをエンコードするためのパッカー(Packer)オブジェクトを生成します。
- pack_list(lst, p.pack_int):リスト内の各要素を指定した関数(ここではpack_int)で順番にパックします。第2引数には各要素をエンコードする関数を渡すのがポイントです。
- xdrlib.Unpacker():パックされたバイト列から元のデータを復元(デコード)するためのアンパッカー(Unpacker)オブジェクトを生成します。
注意点
なお、xdrlibモジュールはPython 3.9で非推奨(Deprecated)となり、Python 3.13では標準ライブラリから削除されました。新しいプロジェクトでは、同等の機能を持つサードパーティ製ライブラリ「xdrlib」のPyPI版を利用するか、より汎用的なシリアライズ方式(JSON、MessagePack、Protocol Buffersなど)の採用を検討することをおすすめします。
-
Pythonのbase64モジュールを使ったデータエンコード・デコード入門
PythonにおけるBase64エンコーディングとはPython標準ライブラリのbase64モジュールは、バイナリデータをプレーンテキスト(ASCII)プロトコルで安全に送信できる形式へ変換するための機能を提供します。メール送信、URLへの埋め込み、HTTP POSTリクエストなど、テキストベースの通信経路でバイナリデータを扱いたい場面で活躍するモジュールです。このモジュールが実装しているのは、RFC 3548で定義されたBase16、Base32、Base64の各アルゴリズム、および事実上の標準となっているAscii85とBase85のエンコーディングです。RFC 3548準拠のエンコーディ
-
MacでPython 3にアップグレードして使いこなす方法
購入したばかりの新しいMacには、必要なソフトウェアの最新版がすべて入っていると思いがちですが、ユーザー向けアプリについては概ね正しくても、基盤となるフレームワークに関しては話が別です。安定版の最新リリースがPython 3.5であるにもかかわらず、新しいMacには今なおPython 2.7.10がプリインストールされています。バージョン間の差が大きく感じられるのはそのためです。ただし、新しいバージョンが必ずしも優れているとは限りません。Python 3はPython 2との後方互換性を持たず、多くの開発者は依然としてPython 2を使い続けているのです。 2to3を使うか、使わないか?