swf ファイルから 特定の id(tag) を持つ DefineBinaryDataTag のデータを取り出す

swftools ( swfextract ) が手元に入らなくて、swf ファイルの仕様書ちょっと見たら簡単に書けそうだったので、go で書きました。いわゆる radiko を録音する時に必要なやつ。

github.com

http://wwwimages.adobe.com/content/dam/acom/en/devnet/pdf/swf-file-format-spec.pdf

に仕様書があるのでこれ通りに適当に必要なところだけパースしていく。 2018 年はこんなもんパースしないようにしたい。

構成

f:id:soh335:20171221210902p:plain

ヘッダー

f:id:soh335:20171221210604p:plain

rect ってやつだけ特殊。 あと最初の signature が C ( 0x43 ) だったら最初の 8 byte 以降 ( Frame Size のとこ)が zlib で圧縮されてる。

Rect

f:id:soh335:20171221210915p:plain

5 bit に長さが入っていてそのあとその長さのが四個ある。

タグ

f:id:soh335:20171221211038p:plain

最初の 10 bit がタグタイプで、6 bit が長さ。長さが 0x3f ( 最大)だったら、そのあとに本当の長さが unsigned integer32 で入ってる。

DefineBinaryDataTag

f:id:soh335:20171221211154p:plain

目的のやつ。Tag と Data が分かれば良い。