MediBangファイルフォーマットの解析(stringsコマンドを使う)

絵の練習でMediBang Paint Proを使っていますが、初めて見る拡張子なので、どんなフォーマットなのか確認していきたいと思います。

まずは、MediBangを起動して、A4サイズの白いキャンバスのまま保存します。

ファイル名は、file1.mdpとしました。
そしてしばらく待ってから、ファイル名を変えて(file2.mdp)保存します。
時間を置いて、2つのファイルに保存したのは、データの中にタイムスタンプが存在するか確認するためです。

まずは、ls -lで、ファイルサイズを確認。

takk@deb8:~/Desktop$ ls -l file[12].mdp
-rw-r--r-- 1 takk takk 1195  3月 12  2017 file1.mdp
-rw-r--r-- 1 takk takk 1195  3月 12  2017 file2.mdp
takk@deb8:~/Desktop$ 

同じサイズのようです。

次に、テキストかバイナリか確認します。

takk@deb8:~/Desktop$ file file[12].mdp
file1.mdp: data
file2.mdp: data
takk@deb8:~/Desktop$ 

textではなくdataと表示されましたので、バイナリもしくは、テキストとバイナリの混在のようです。

バイナリ差分があるか確認しましょう。cmpを使います。

takk@deb8:~/Desktop$ cmp file[12].mdp
file1.mdp file2.mdp 異なります: バイト 269、行 4

差分がありました。時間をおいて保存しただけなのに差分があるということは、タイムスタンプが埋め込まれている可能性が大きいです。

cmpはデフォルトで8進表示なので、これ以上cmpで調べても面倒ですので、バイナリをテキストに変換し、diffをかけることにします。
odを使って16進ダンプのテキストに変換。

takk@deb8:~/Desktop$ od -tx1z file1.mdp > 1.txt
takk@deb8:~/Desktop$ od -tx1z file2.mdp > 2.txt

変換したテキストをdiffします。

takk@deb8:~/Desktop$ diff -C1 [12].txt
*** 1.txt	2017-03-12 12:24:27.180582421 +0900
--- 2.txt	2017-03-12 12:24:31.970976457 +0900
***************
*** 16,21 ****
  0000360 20 20 3c 55 70 64 61 74 65 54 69 6d 65 20 74 69  >  <UpdateTime ti<
! 0000400 6d 65 3d 22 31 34 38 39 32 38 38 38 33 38 22 20  >me="1489288838" <
  0000420 74 69 6d 65 53 74 72 69 6e 67 3d 22 32 30 31 37  >timeString="2017<
! 0000440 2d 30 33 2d 31 32 54 31 32 3a 32 30 3a 33 38 22  >-03-12T12:20:38"<
! 0000460 20 72 65 76 3d 22 31 22 20 2f 3e 0a 20 20 20 20  > rev="1" />.    <
  0000500 3c 54 68 75 6d 62 20 77 69 64 74 68 3d 22 31 38  ><Thumb width="18<
--- 16,21 ----
  0000360 20 20 3c 55 70 64 61 74 65 54 69 6d 65 20 74 69  >  <UpdateTime ti<
! 0000400 6d 65 3d 22 31 34 38 39 32 38 38 38 35 37 22 20  >me="1489288857" <
  0000420 74 69 6d 65 53 74 72 69 6e 67 3d 22 32 30 31 37  >timeString="2017<
! 0000440 2d 30 33 2d 31 32 54 31 32 3a 32 30 3a 35 37 22  >-03-12T12:20:57"<
! 0000460 20 72 65 76 3d 22 32 22 20 2f 3e 0a 20 20 20 20  > rev="2" />.    <
  0000500 3c 54 68 75 6d 62 20 77 69 64 74 68 3d 22 31 38  ><Thumb width="18<
takk@deb8:~/Desktop$ 

やはり、タイムスタンプが更新されてます。しかもテキストで格納されています。
バイナリとテキストの混在書式ですね。
stringsコマンドで、文字列の位置を確認しておきましょう。stringsコマンドに-t dオプションをつけると、文字列が存在するオフセットがわかります。

takk@deb8:~/Desktop$ strings -t d file1.mdp
      0 mdipack
     20 <?xml version="1.0" encoding="UTF-8" ?>
     60 <Mdiapp width="2893" height="4092" dpi="350" checkerBG="true" bgColorR="255" bgColorG="255" bgColorB="255">
    168     <CreateTime time="1489288838" timeString="2017-03-12T12:20:38" />
    238     <UpdateTime time="1489288838" timeString="2017-03-12T12:20:38" rev="1" />
    316     <Thumb width="180" height="256" bin="thumb" />
    367     <Snaps />
    381     <Layers active="0">
    405         <Layer ofsx="0" ofsy="0" width="2893" height="4092" mode="normal" alpha="255" visible="true" protectAlpha="false" locked="false" clipping="false" masking="false" maskingType="0" group="-1" id="0" draft="false" parentId="-1" name="
    655 1" binType="2" bin="layer0img" type="32bpp" />
    702     </Layers>
    716 </Mdiapp>
    726 PAC M
    794 thumb
   1054 g KZ
   1059 PAC 
   1127 layer0img

ファイルサイズは1195でしたので、この保存データ(白いキャンバスデータ)は、ほぼ文字列で構成されているようです。

続く。

One response to “MediBangファイルフォーマットの解析(stringsコマンドを使う)

  1. Pingback: MediBangファイルフォーマットの解析(Vimの勝手な改行の抑制) | コマンドの達人

Leave a Reply

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

CAPTCHA