MediBangファイルフォーマットの解析(Vimとxxdでバイナリ比較)

MediBang Paint Proでmdp拡張子で保存するときの、xmlのフォーマットを自力で解析する続きです。
何も描いていないキャンバスデータの保存データと、レイヤーを追加したデータで比較してみます。

takk@deb8:~/Desktop$ wc -c file-layer*.mdp
1195 file-layer1.mdp
1628 file-layer2.mdp
2061 file-layer3.mdp
4884 合計
takk@deb8:~/Desktop$ expr 2061 - 1628
433
takk@deb8:~/Desktop$ expr 1628 - 1195
433
takk@deb8:~/Desktop$ 

ファイル名のlayerの後の数字は、レイヤー数を表します。
ファイルサイズを比較すると、レイヤー1つにつき、433バイト増えているようです。

Vimを使ってバイナリ差分を眺めてみましょう。

takk@deb8:~/Desktop$ vim -O file-layer[12].mdp

Vimが起動したら、:windo :%!xxdで、各バイナリをの16進ダンプに変換します。

16進ダンプに変換後、:windo diffthisで、diffします。

上の画像では小さくで見えないので、左右の比較を上下に並べてクローズアップします。
上がレイヤー1つ、下がレイヤー2つのファイルデータです。

一行目から差分がありますね。

レイヤー1つのファイルでは、c202、レイヤー2つのファイルではeb03です。数字をみると、リトルエンディアンっぽいので、上下逆にして2c2と3eb、つまり10進数で706と1003です。1003-706=297。ファイル全体のサイズ差である433よりも小さい数字になっています。おそらく、各レイヤーのヘッダ分、もしくはデータ分を除いたサイズと思います。

ではstringsで、だいたいのヘッダ部分のサイズ差を求めます。

takk@deb8:~/Desktop$ strings file-layer1.mdp | wc -c
735
takk@deb8:~/Desktop$ strings file-layer2.mdp | wc -c
1036
takk@deb8:~/Desktop$ expr 1036 - 735
301
takk@deb8:~/Desktop$ 

さきほどの297という数字に近いので、一行目の数字はレイヤー部分のヘッダで確定かと思います。

おそらく、こんな構造になっているに違いありません。

続く

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA