swf ファイルから 特定の id(tag) を持つ DefineBinaryDataTag のデータを取り出す
swftools ( swfextract ) が手元に入らなくて、swf ファイルの仕様書ちょっと見たら簡単に書けそうだったので、go で書きました。いわゆる radiko を録音する時に必要なやつ。
http://wwwimages.adobe.com/content/dam/acom/en/devnet/pdf/swf-file-format-spec.pdf
に仕様書があるのでこれ通りに適当に必要なところだけパースしていく。 2018 年はこんなもんパースしないようにしたい。
2017 年も年末なのに、夜中に swf ファイルの(必要なとこだけだけど)パーサを書いてしまい非常に辛い....
— soh335 (@soh335) December 20, 2017
若干ウケるけど冷静に考えて辛いなこれは
— soh335 (@soh335) December 20, 2017
構成
ヘッダー
rect ってやつだけ特殊。 あと最初の signature が C ( 0x43 ) だったら最初の 8 byte 以降 ( Frame Size のとこ)が zlib で圧縮されてる。
Rect
5 bit に長さが入っていてそのあとその長さのが四個ある。
タグ
最初の 10 bit がタグタイプで、6 bit が長さ。長さが 0x3f ( 最大)だったら、そのあとに本当の長さが unsigned integer32 で入ってる。
DefineBinaryDataTag
目的のやつ。Tag と Data が分かれば良い。