Next: , Previous: , Up: バイト配列のpackとunpack   [Contents][Index]


40.20.2 バイトのunpackとpackを行う関数

以降のドキュメントではtypebindat-typeがリターンするようなBindatデータ値、rawはバイト配列、structはunpackされたフィールドデータを表すalistを参照します。

Function: bindat-unpack type raw &optional idx

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

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

Function: bindat-get-field struct &rest name

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

たとえば(bindat-get-field struct a b 2 c)なら、フィールドaの副フィールドbの3つ目の要素からフィールドcを探すことを意味する(Cプログラミング言語の構文struct.a.b[2].cに該当)。

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

Function: bindat-length type struct

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

Function: bindat-pack type struct &optional raw idx

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

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

Function: bindat-ip-to-string ip

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

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