2010/1/12加筆
文字列を思いっきり勘違いしてました。パスカル文字列のように
初めの1byteが文字列長(0〜255)で、その後ろに文字列長分のテキストが続きます。
そして、先の 0 は null terminate でなく 0 個の文字列を意味します。
rect 処理修正
テキストツールで貼り付けた矩形の情報を表示すると
以下のような頓珍漢な値が表示されていました。
(min が max より大きい…)
tag=DefineEditText(37) length=42 edit_id=2 rect=(393, 393)-(37, 146) (f_size=13) text=1 wwrap=0 multi=0 pass=0 ro=1 col=
これで、自分がフォーマットを勘違いしているのかと悩んだのですが、
この値を埋めるフィールドが可変な上に負の値も扱える事に気づいて、
bitstream は unsigned 前提で作ってるので、2の補数処理をどこかに
入れないとダメな事に気づきました。
↓処理はこんな感じで。関数名が思いつかなったので許して… ○rz
int two_negative(int num, int size) { int msb = 1 << (size - 1); int mask = msb - 1; if (num & msb) { return - ((num^mask) & mask) - 1; } return num;
結果。
tag=DefineEditText(37) length=47 edit_id=2 rect=(-8, -2)-(101, 36) (f_size=12)
それっぽい値になりました。
DefineEditText の string
文字列の抽出の仕方が分かりました。
静止テキストの時はインスタンス変数が指定できない=variable_name が空で、その時は、'\0'の 1 byte のみ展開されます。
SWF フォーマットの string は null terminate のバイト列という定義なので、少し考えれば当たり前なんですけど。
tag=DefineEditText(37) length=47 edit_id=2 rect=(-8, -2)-(101, 36) (f_size=12) text=1 wwrap=0 multi=1 pass=0 ro=1 col=1 maxlen=0 font=1 layout=1 no_sel=1 border=0 font_id=1 font_height=14 red=0x00 green=0x00 blue=0xff alpha=0xff align=2 (left,right)_margine=(0,0) indent=0 leading=40 variable_name= fobaa initial_text=thisistest
よし…