Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

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設計(プロトタイプチェーン)を書こうと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?