Next: , Previous: , Up: Byte Packing   [Contents][Index]


36.20.2 バイトのunpackとpackのための関数

以降のドキュメントではspecはデータレイアウト仕様、bindat-rawはバイト配列、structはunpackされたフィールドデータを表すalistを参照します。

Function: bindat-unpack spec bindat-raw &optional bindat-idx

この関数はユニバイト文字列、またはバイト配列bindat-rawのデータをspecに応じてunpackする。これは通常はバイト配列の先頭からunpack化を開始するが、bindat-idxが非nilならかわりに使用する0基準の開始位置を指定する。

値はそれぞれの要素がunpackされたフィールドを記述するalistかネストされたalist。

Function: bindat-get-field struct &rest name

この関数はネストされたalistであるstructからフィールドのデータを選択する。structは通常はbindat-unpackがリターンしたもの。nameが単一の引数に対応する場合にはトップレベルのフィールド値を抽出することを意味する。複数のname引数は副構造体を繰り返して照合することを指定する。整数の名前は配列のインデックスとして動作する。

たとえばname(a b 2 c)なら、それはフィールドaの副フィールドbの3番目の要素内のフィールドc (Cではstruct.a.b[2].cに相当)を意味する。

packやunpackの処理をすることによりメモリー内でデータ構造が変化しても、そのデータの全フィールド長の合計バイト数であるトータル長(total length)は保たれます。この値は一般的に仕様またはalist単独では固有ではありません。そのかわりこれら両方の情報がこの計算に役立ちます。同様にunpackされる文字列や配列の長さは仕様の記述にしたがってデータのトータル長より長くなるかもしれません。

Function: bindat-length spec struct

この関数はstruct内のデータのspecに応じたトータル長をリターンする。

Function: bindat-pack spec struct &optional bindat-raw bindat-idx

この関数はalist struct内のデータからspecに応じてpackされたバイト配列をリターンする。これは通常は先頭から充填された新たなバイト配列を作成する。しかしbindat-rawが非nilなら、それはpack先として事前に割り当てられたユニバイト文字列かベクターを指定する。bindat-idxが非nilならbindat-rawへpackする開始オフセットを指定する。

事前に割り当てる際にはout-of-rangeエラーを避けるために、(length bindat-raw)がトータル長またはそれ以上であることを確認すること。

Function: bindat-ip-to-string ip

インターネットアドレスのベクターipを通常のドット表記による文字列に変換する。

(bindat-ip-to-string [127 0 0 1])
     ⇒ "127.0.0.1"