Flash Advent Calendar 3日目 - JavaScriptバイナリ入門 -


開発環境は整ったので、いざSWFファイルのバイナリデータを分解していこうと思います。
とはいえ、バイナリに関して全く知識がないので、必要そうな知識を頭に入れておきます。

目次

  • TypedArray
  • Bit演算

TypedArray

バイナリデータを扱う上でTypedArrayの知識は必須です。
型と扱える範囲を覚えておきます。

参考サイト
TypedArray - MDN - Mozilla

範囲
Int8Array -128 ~ 127
Uint8Array 0 ~ 255
Int16Array -32768 ~ 32767
Uint16Array 0 ~ 65535
Int32Array -2147483648 ~ 2147483647
Uint32Array 0 ~ 4294967295
Float32Array 1.2×10-38 ~ 3.4×1038
Float64Array 5.0×10^-324 ~ 1.8×10^308

また、TypedArrayは可変できないので注意が必要です。
必要な分だけメモリーを確保します。

const typedArray = new Uint8Array(100);

// 100以上の数値を代入する
for (let idx = 0; idx < 110; idx++) {
    typedArray[idx] = idx;
}

// 結果
console.log(typedArray.length); // 100
console.log(typedArray) // 0から99までの値が代入されます。

Bit演算

ここまでは、なんとか理解できたのですが
ここからが難題です・・・
事前にBit演算の式と結果をふんわりみておきます。

ビットシフト演算子

演算子
<< 左シフト演算子 typedArray[offset] << 8
>> 右シフト演算子 typedArray[offset] >> 7
>>> 符号なし右シフト演算子 typedArray[offset] >> 5

バイナリービット演算子

演算子
& 論理積 (AND) typedArray[offset] & 0x1
論理和 (OR) typedArray[offset]|0
^ 排他的論理和 (XOR) typedArray[offset] ^ 2

では、Adobeが提供しているSWFのバイナリの仕様書からSWFの実装を読み解いていきます。
SWF File Format

ええ。全然、理解できません。。。
そこで、バイナリを操作できるライブラリを探しました。

最初に辿り着いたのが@yoya さんの作ったIO_Bitでした。
ありがたく、実装内容を参考にSWFの仕様書を読み解いていきます。

UI8 [Unsigned 8-bit integer value]

getUI8 () 
{
    // offsetをインクリメントして次のポインターに移動
    return typedArray[offset++];
}

UI16 [Unsigned 16-bit integer value]

getUI16 () 
{
    return typedArray[offset++] | (typedArray[offset++] << 8);
}

UI24 [Unsigned 24-bit integer value]

getUI24 () 
{
    return typedArray[offset++] | (typedArray[offset++] 
        | (typedArray[offset++] << 8) << 8);
}

UI32 [Unsigned 32-bit integer value]

getUI32 () 
{
    return typedArray[offset++] | (typedArray[offset++]
            | (typedArray[offset++] | (typedArray[offset++] << 8) << 8) << 8);
}

IO_Bitを参考にしながら
一つ一つ仕様書の実装を入れ込んでいきます。

後は仕様があっていれば、そのパターンをテスト実装していきます。
JavaScriptでのテスト駆動開発

とても地味な作業ですが、ここをしっかり作れば2度3度と改修する必要はないので気長にがんばります。。。

仕様書は複数あるので、ひたすら解読と実装とテストを繰り返します。
ActionScript3.0の仕様書
Action Message Format AMF3
Video File Format

少し気が遠くなりそうですが、ここさえできれば
っという気持ちでがんばります。

とはいえ、あまり実用性もないと思いますので
今日はこの辺で終わろうと思いますw

明日はclass設計(プロトタイプチェーン)を書こうと思います。