馬鹿な人日記

常にPCいじってる馬鹿な人の日記です。

全体的な構造が分かった

id:harimau_tigrisさんによって、
ファイル全体の組み立てが明らかになりました。
どうやら幾つかののセクションと256バイトのチェックサム
と言う風に区切られているようです。

セクションはKFH、KTN、KMC、KMI、KSNの五種類で、
入ってるデータは、順にファイルヘッダ、サムネイルデータ、
メモのページデータが二つとサウンドデータ。

各セクションは次のような仕組みだそうです。

まず最初の3バイトが各セクションの識別子(マジックナンバー)。
次の1バイトは謎。謎だけど、
なんかセクションごとに決まってるからマジックナンバーの一部なのかも知れない。
そしてその次の4バイトがそのセクションのデータサイズ(バイト数)。
ただしこれらのセクションヘッダ(合計8バイト)を除く。

例えば一番最初に来るKFHセクションを例にとると、
まずマジックナンバー。ASCIIの"KFH"(4B 46 48)
そして謎の1バイト。

次にサイズ。KFHセクションの場合は204(0xCC)バイトで固定。
で、セクションヘッダをとばした0x0008からの204バイトがKFHセクションのデータ。

0x0008 + 0x00CC は0x00D4。つまり0x00D4でKFHセクションが終わり、
次のKTNセクションが続いている。
で、最後のKSNセクションの後にチェックサムがある。

ちょっと文章書くのは下手なんで分かりにくいかもしれませんが…
だいたいこんな感じです。



あとその他の発見や考察を載せておきます。

まずKTNセクション。
ここにあの589バイトの、あらゆるメモで完全に一致するデータがある訳ですが、
サムネイルのデータを表すセクションの中である事を考えると、
あのデータもサムネイルのデータと考えられます。
で、DSiメモだけがなぜか全く違うデータになっているのには、
こんな理由が考えられます。

前回の記事で書いたとおり、
DSiうごメモのサムネイル画像は64×48ドットですが、
3DSうごメモでは80×60ドットになっています。
なのでもしサムネイルのデータをそのまま引き継いでしまったら、
解像度の違いなどから不自然な挙動が起きてしまう可能性があります。
なのであの完全一致地帯には、サムネイル画像のデータの保管方法や、
表示方法などの色々な情報が入っているのかも知れません。
もしそうだとするとサムネイル画像は、
DSiメモと普通のメモでは違う方式で記録されている可能性が十分にあります。


次にKMCセクションとKMIセクション。
ともに各ページのデータを格納してると考えられますが、
KMIセクションの方が圧倒的に短いです。
つまり画像ではなく、色や奥行きなどの情報を格納してると考えられます。
また、サイズも規則的です。
KMCセクションは、バイト数がページ数で割りきれなかったり、
ページ数が多いのに、別のページ数の少ないメモよりサイズが小さいこともよくあり、
つまりサイズがページによって違う可変長と言う事になりますが、
KMIセクションは必ずバイト数をページ数で割ると28バイトになります。
つまり1ページにつき28バイトを使ってるということです。

解析が簡単そうなので、解析してみました。
ただしざっくりとしかやってないので、間違いがあるかも知れません。

紙色 1バイト
レイヤAペン色 1バイト
レイヤBペン色 1バイト
レイヤCペン色 1バイト
謎データ 6バイト
作者ID 10バイト
レイヤA奥行き 1バイト
レイヤB奥行き 1バイト
レイヤC奥行き 1バイト
パディング? 5バイト

ページの作者のIDまで入ってるんですね。
ページずつの丸コピなどもこれで見破れるってもんです。
あとペンの色はレイヤにつき2色選べますが、
上位ワードと下位ワードにそれぞれデータを格納してるようです。
ちなみにこれを調べてる最中に、別の事に気付きました。
各レイヤの可視/不可視のデータの場所です。
0x00D3で、下から各ビットが順番にレイヤA・B・Cに対応しており、
不可視のレイヤは1、可視のレイヤは0となっていました。


今日は以上終了。
紙色やペン色の色の対応はまだ確認してないので、
次回確認してみたいと思います。
なんとなく全容が分かって来たので、
今分かってるデータを解析するソフトでも作ろうかなと思ってます。


追記:
「セクション」という言い方は僕が勝手に付けました。