1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FlashAdvent Calendar 2020

Day 3

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

Posted at

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?