オクテット列に対する操作

 TJS2 では、オクテット列は擬似的に Octet クラスのオブジェクトということになっていますが、Octet クラスは存在していませんし、実際に Octet クラスのオブジェクトというわけではありません ( ただし オクテット列に対して typeof 演算子を使うと "Octet" を返します )。
 しかし オクテット列をオブジェクトと見立てて、いくつかのメソッドやプロパティが使用可能になっています。

 オクテット列に関する実装は未完成です。

length

 length プロパティは、オクテット列の長さを返します。メソッドではなくてプロパティですので注意してください。ただし、このプロパティへの値の代入はできません。


例:
    var oct = <% 11 22 33 %>;
    var n = oct.length;  // n には 3 が代入される
    var n = <% 11 22 33 %>.length; // これも同じく 3 が代入される

'数値' プロパティ

 数値をプロパティとして間接指定すると、その位置にあるオクテットにアクセスできます。
 結果はオクテットの数値で表されます。
 たとえば、oct がオクテット列を表す式だとすると、oct[0] は先頭のオクテットの値を表す数値になります。
 数値がオクテット列よりも長い位置や、負の場合は例外が発生します。

 代入式を生成することはできません。

例:
    var oct = <% 11 22 33 44 55 %>;
    var c = oct[0];  // 0x11 が c に代入される
    var c = oct[2];  // 0x22 が c に代入される
    oct[3] = 'A'; // 代入式は生成できないのでエラーになる
    var c = oct[100]; // 値が範囲外なのでエラーになる

unpack

 unpack メソッドは、引数で指定された文字列に従い、バイナリ(Octet)を配列(Array)化して返します。
 指定の文字列はテンプレートと呼びます。
 テンプレートは、型指定文字とその長さを並べたものです。長さとして * が指定された時は残り全ての長さを表します。長さが省略された場合は1として扱います。

構文 : unpack(テンプレート文字列)

テンプレート文字列には以下の文字が使用可能です。
 a : ASCII 文字列(ヌル文字が補完される)
 A : ASCII 文字列(スペースが補完される)
 b : 2進数文字列(下位ビットから上位ビットの順)
 B : 2進数文字列(上位ビットから下位ビットの順)
 c : 符号付き1バイト数値(-128 縲鰀 127)
 C : 符号無し1バイト数値(0縲鰀255)
 d : 倍精度浮動小数点値
 f : 単精度浮動小数点値
 h : 16進数文字列(low nybble first)
 H : 16進数文字列(high nybble first)
 i : 符号付きint数値(通常4バイト)
 I : 符号無しint数値(通常4バイト)
 l : 符号付きlong数値(通常4バイト)
 L : 符号無しlong数値(通常4バイト)
 n : 符号無しshort数値(ネットワークバイトオーダ)
 N : 符号無しlong数値(ネットワークバイトオーダ)
 s : 符号付きshort数値(通常2バイト)
 S : 符号無しshort数値(通常2バイト)
 v : 符号無しshort値(リトルエンディアン)
 V : 符号無しlong値(リトルエンディアン)
 x : 1バイト読み飛ばす
 X : 1バイト後退
 @ : 指定位置まで移動
 m : Base64 encode

例:
    var array = octet.unpack("a4i2");

 この例ではoctetの最初4バイトをASCII文字であるとみなし4文字の文字列を配列の0番目に出力します。
 次に8バイトを32ビット符号付き整数2個として、配列の1番目と2番目に出力します。
 つまり、array[0]に"xxxx"と言った文字列、array[1]とarray[2]に整数が出力されます。