Construct (Python ライブラリ)
Constructは、宣言的な方法でデータ構造を構築および分解するためのPythonライブラリです。ここで言う「構築」とは、プログラムオブジェクトをバイナリ表現に 変換(シリアル化)するプロセスを指します。
分解、あるいは解析とは、バイナリデータをプログラムオブジェクトに変換(デシリアライズ)する逆のプロセスを指します。宣言的とは、目的を達成するために手続き型コードを記述するという慣例ではなく、ユーザーコードがデータ構造を定義することを意味します。Constructは、ビットレベルおよびバイトレベルのデータ粒度と、様々なバイト順序をシームレスに処理できます。
利点
宣言型コードの使用には多くの利点があります。例えば、解析可能なコードでビルドも可能(対称性)、デバッグとテストがはるかにシンプル(ある程度の証明が可能)、新しい構成要素の作成が容易(コンポーネントのラップ)など、他にも多くの利点があります。[要出典] C(プログラミング言語)に精通している方であれば、構成要素とは、データをアンパックするコードを書くのではなく、ある要素から別の要素へ、あるいはその逆のキャストであると考えることができます。char *struct foo *
例
以下の例は、 Construct を用いてTCP/IP プロトコルスタックを定義する方法を示しています。簡潔さと分かりやすさのため、一部のコードは省略されています。また、以下のコードはオブジェクトを作成する Python コードであることに注意してください。
ethernet = 構造体( "destination" / バイト( 6 ), "source" / バイト( 6 ), "type" / 列挙型( Int16ub , IPv4 = 0x0800 , ARP = 0x0806 , RARP = 0x8035 , X25 = 0x0805 , IPX = 0x8137 , IPv6 = 0x86DD , ), )次に、IPヘッダー (レイヤー 3) です。
ip = Struct ( "header" / BitStruct ( "version" / Const ( Nibble , 4 ), "header_length" / Nibble , ), "tos" / BitStruct ( "precedence" / Bytes ( 3 ), "minimize_delay" / Flag , "high_throuput" / Flag , "high_reliability" / Flag , "minimize_cost" / Flag , Padding ( 1 ), ), "total_length" / Int16ub , # ... )そして最後に、TCPヘッダー (レイヤー 4) です。
tcp = 構造体( "source" / Int16ub 、 "destination" / Int16ub 、 "seq" / Int32ub 、 "ack" / Int32ub 、 # ... )次に、プロトコルスタックの階層構造を定義します。以下のコードは、隣接するプロトコルのペアをそれぞれ個別のユニットに「結合」します。各ユニットは、含まれるプロトコルに基づいて適切な次の層を「選択」します。
layer4tcp = 構造体( tcp , # ... ペイロード ) layer3ip = Struct ( ip , "next" / Switch ( this . protocol , { "TCP" : layer4tcp , } ), ) layer2ethernet = Struct ( ethernet , "next" / Switch ( this . type , { "IP" : layer3ip , } ), )この時点で、コードはキャプチャした TCP/IP フレームを「パケット」オブジェクトに解析し、これらのパケット オブジェクトをバイナリ表現に再構築できます。
tcpip_stack = layer2ethernet packet = tcpip_stack . parse ( b "...raw キャプチャされたパケット..." ) raw_data = tcpip_stack . build ( packet )移植とスピンオフ
パール
Data::ParseBinary [1]は、Construct をPerl プログラミング言語に移植したものとして生まれたCPANモジュールです。(その着想については、メインの POD ドキュメントを参照してください。)初期バージョン以降、元の API の一部は非推奨となっています。
ジャワ
Javaへの移植版はGitHubで公開されています。[2] JavaでのEthernetヘッダー(レイヤー2)の例:
ethernet_headerを構築します= Struct ( "ethernet_header" 、MacAddress ( "destination" )、MacAddress ( "source" )、Enum ( UBInt16 ( "type" )、"IPv4" 、0x0800 、"ARP" 、0x0806 、"RARP" 、0x8035 、"X25" 、0x0805 、"IPX" 、0x8137 、"IPv6" 、0x86DD 、"_default_" 、Pass )); 参照
参考文献
- ^ “Data::ParseBinary - バイナリ構造のためのもう一つのパーサー - metacpan.org”. metacpan.org . 2023年8月29日閲覧。
- ^ Ziglioli、Emanuele (2022-12-29)、ZiglioUK/construct 、2023-08-29取得
外部リンク
- Constructのドキュメント
- Constructのリポジトリ
- Pythonトレーニング