ByteArray (2)
2008/07/26 23:41 - AS3.0
ByteArray のメソッドについて。
ByteArray のメソッドは ByteArray オブジェクトへの書き込みと、ByteArray オブジェクトからの読み込み。 その二種類だけと考えてほぼ差し支えないんじゃないでしょうかね(compress と uncompress はひとまずスルーの方向で)。
で、この read と write それぞれにおいて重要な働きをするのが position プロパティです。 読込・書込の開始位置を指定します。
ByteArray 配列は position というポインタで位置指定をしなくてはいけないという点で、Array および Vector 配列とはまったく異なります。 はじめは戸惑いますね。
write については position が暗黙的に設定されることにより、ユーザは特に意識しないで済むケースが多いと思います。 しかし read の場合は position を常に意識していないと思わぬ配列範囲外エラーに見舞われること必定。
そこいらへんも含め、まずは一番簡単なブール値に関するメソッドについて見てみます。
ブール値の write、read に関わるメソッド
writeBoolean(value:Boolean):void
このメソッドを使うと ByteArray オブジェクトに1バイトの書き込みがなされます。そのとき position は +1 されます。
引数が true だった場合は 1 が、false だった場合は 0 が ByteArray オブジェクトに書き込まれます。 ということは true では 0x0001 が、false では 0x0000 が書き込まれるってことすかね。
1ビットで済む情報に8ビットを費やすんだから贅沢ぅ、ってゆーか1ビットよりも1バイトの方が扱い易いんでしょう、きっと。
readBoolean():Boolean
このメソッドを使うと ByteArray オブジェクトからブール値を読み取ることができます。 そのとき write 同様 position は +1 されます。
読み込んだバイトが 0 の場合は false を、それ以外の場合は true を返します。
注意すべきは、現在の position の値の場所から1バイト読み込むということ。
以下サンプルコード。
(1) var ba:ByteArray = new ByteArray(); ba.writeBoolean(true); ba.writeBoolean(true); ba.writeBoolean(false); ba.writeBoolean(true); ba.writeBoolean(false); trace("position:", ba.position, " length:", ba.length); (2) trace("\nreadBoolean()"); var len:uint = ba.length; ba.position = 0; while (ba.position < len){ trace(ba.position, ":", ba.readBoolean()); } (3) trace("\n[]access"); for (var i:uint = 0; i < len; i++){ trace("ByteArray[",i,"] :", ba[i]); }
その trace 結果。
(1) position: 5 length: 5 (2) readBoolean() 0 : true 1 : true 2 : false 3 : true 4 : false (3) []access ByteArray[ 0 ] : 1 ByteArray[ 1 ] : 1 ByteArray[ 2 ] : 0 ByteArray[ 3 ] : 1 ByteArray[ 4 ] : 0
(1) で writeBoolean を5回おこないます。その結果、position と length がそれぞれ 5 になりました。
writeBoolean ごとに position が裏でインクリメントされているということがわかりますね。
writeBoolean は前述のとおり ByteArray オブジェクトに1バイトの書き込みをおこないます。そして length はバイト単位のサイズなので5になるわけですね。
(2) で ByteArray オブジェクトから読み込みをします。
ここで重要なのは、読み込み前に position を 0 に戻さなければならないこと。
(1)が完了した段階で position は 5 になっていますが、これをそのままにして readBoolean を実行すると、ByteArray オブジェクトの6バイト目を読み込みにいきます。 しかし ByteArray オブジェクトは5バイトなので、その結果、配列範囲外エラーが発生します。
「position を戻す」という行為が今まで配列を扱うときになかった概念なので、慣れるまでは戸惑いまくりです。 ByteArray を使うなら position を常に意識しろ、ということですね。
(3)では ByteArray にアクセス演算子 [ ] でアクセスしています。
このように ByteArray には [ ] でアクセスすることもできます。 その際は現在の position の値は関係ありません。
[ ] によるアクセスは後ほど改めて検証しますが、使わない方が無難な気がします。 今はとりあえず trace 結果を表示するにとどめます。