開発環境は整ったので、いざ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設計(プロトタイプチェーン)を書こうと思います。