ByteArray (4)
2008/07/29 21:21 - AS3.0
ByteArray のメソッド、数値の write、read についての続き。
メモリ占有量が各バイトの write メソッドを実行したとき、position と length がどのような値を示すのかを見てみましょう。
6個の ByteArray オブジェクトを生成し、それぞれに対して writeXXXX を1回だけ実行、その後の position と length を trace したのが以下の結果です。
writeByte position: 1 length: 1 writeShort position: 2 length: 2 writeInt position: 4 length: 4 writeUnsignedInt position: 4 length: 4 writeFloat position: 4 length: 4 writeDouble position: 8 length: 8
position、length ともに、何回 writeXXXX を実行したか、ではなく、何バイト分のデータを書き込んだのか、で、その値が決まる、ということが分かります。
length はバイト長だということだったので、こういう結果になることは予想していましたが、position というのは、アクセス演算子 [ ] の中に入る数字と同じようなものだろうと何の根拠もなく思い込んでいました。だから結果はすべて 1 になるんだろう、と。
しかし position というのは、その ByteArray オブジェクトの、バイト単位での現在位置を指し示すカーソルに過ぎないというワケですね。 不見識を改めなければなりませんなーこりゃ。
となると ByteArray オブジェクトにどういう順番で、どういう種類のデータを書き込んでいったのかを、ユーザがしっかり管理しとかなアカンちゅーワケやね。
例えば、Double、Byte、Short、Short、Double という順番で書き込みをした場合、目的の場所のデータを読み出すなら、position を 0、8、9、11、13 と進めろよ、と。
position の位置を間違えると取り出されるデータが思いもよらないものになってしまうよ、と、そういうことですね。
- MainNumeric2.as (最後に ByteArray の配列範囲外エラーが出ます)
あ、でも、バイト長が異なるデータが混在してても、最初から順番にデータを読み込むだけなら、position を 0 にして readXXXX() の XXXX の部分を間違えないようにしながら、連続で readXXXX を実行すればいいだけか。 だったら position は特に意識しなくて構わないのか。
いずれにせよ ByteArray の管理はとにかく何よりユーザが自前でしっかりおこなわなければならない、ということがよーく分かりました。
とりあえず position は 0 にするときに参照するくらいで、あとは極力使わないで済むような設計をしといた方が無難ですかねー。
自前で ByteArray をデータ格納庫として使う場合、Vector みたいに、同じデータ型だけを格納する程度の使い方にとどめておこうと、心に誓うワタクシでした。