ByteArrayの罠

罠……と今度こそ言っていいと思うぞ。


ByteArrayは、バイナリデータを扱うための、まぁ、JavaでいうところのByteArrayInputStreamとか、ByteArrayOutputStreamなんかのActionScript3.0版です。
中身にByteのデータ(ちなみに、ActionScript3.0にはbyte型というのはないので、あくまで内部的な持ち方です)の配列になっていて、ストリーム風にも、ArrayAccessでも扱うことが出来ます。
ストリームで扱うのは以下のメソッド

public function readByte():int

バイトストリームから符号付きバイトを読み取ります。
戻り値は -128 〜 127 の範囲です。
戻り値
int ― -128 〜 127 の整数です。

ってことは、中身があたかもsigned っぽくみえます。
でも、これをArrayAccess(括弧を付けてあつかうhoge[index]みたいな感じ)で見ると、実は中身はunsigned(0から255)です。
えー? いや、ま、どこにも内部情報がsignedだなんて書いてないので、かってに読み取っただけですけど、うーむ。
これだけで半日まるまる悩みました。値が明らかに変なんだもんなー。


ちなみに、以下のコードを比べると、後者の方が6倍くらい早いです。

for (var i:int=0;i

aStream.readBytes(aByteArray,0,available);

後者はネイティブで最適化された実装がなされてるんでしょうね……。
とほほ。当たり前と言えば当たり前なんですが……。