Construct (Python ライブラリ)

Constructは、宣言的な方法でデータ構造を構築および分解するためのPythonライブラリです。ここで言う「構築」とは、プログラムオブジェクトをバイナリ表現に 変換(シリアル化)するプロセスを指します。

分解、あるいは解析とは、バイナリデータをプログラムオブジェクトに変換(デシリアライズ)する逆のプロセスを指します。宣言的とは、目的を達成するために手続き型コードを記述するという慣例ではなく、ユーザーコードがデータ構造を定義することを意味します。Constructは、ビットレベルおよびバイトレベルのデータ粒度と、様々なバイト順序をシームレスに処理できます

利点

宣言型コードの使用には多くの利点があります。例えば、解析可能なコードでビルドも可能(対称性)、デバッグとテストがはるかにシンプル(ある程度の証明が可能)、新しい構成要素の作成が容易(コンポーネントのラップ)など、他にも多くの利点があります。[要出典] C(プログラミング言語)に精通している方であれば、構成要素とは、データをアンパックするコードを書くのではなく、ある要素から別の要素へ、あるいはその逆のキャストであると考えることができますchar *struct foo *

以下の例は、 Construct を用いてTCP/IP プロトコルスタックを定義する方法を示しています。簡潔さと分かりやすさのため、一部のコードは省略されています。また、以下のコードはオブジェクトを作成する Python コードであることに注意してください。

まず、イーサネット ヘッダー(レイヤー 2)

 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 ));                     

参照

参考文献

  1. ^ “Data::ParseBinary - バイナリ構造のためのもう一つのパーサー - metacpan.org”. metacpan.org . 2023年8月29日閲覧
  2. ^ Ziglioli、Emanuele (2022-12-29)、ZiglioUK/construct 2023-08-29取得
  • Constructのドキュメント
  • Constructのリポジトリ
  • Pythonトレーニング
Retrieved from "https://en.wikipedia.org/w/index.php?title=Construct_(Python_library)&oldid=1258875051"