うごメモのPPMファイルを独自に解析する

前に少し書きましたが、やっとそれっぽいものができたので。
まず、参考サイト。
うごくメモ帳のメモデータ *.ppm - mirai-iro's diary
Flipnote Files/PPM - DSiBrew
下の方はほとんど英語が読めないので苦しかったです。
2つのサイトで数箇所違いがありますが、id:marai-iroさんのほうが正しかったようです。たぶん。

独自にいろいろやった結果です。
始めと終わりはアドレスで、16進数です。長さはbyte数です。.NET型は個人的にC#で読み込んだときに利用した型です。
念のため、対応表。

.NET 長さ(bit) 長さ(byte) 説明
ulong System.UInt64 64bit 8byte 符号なし32bit整数
uint System.UInt32 32bit 4byte 符号なし32bit整数
ushort System.UInt16 16bit 2byte 符号なし16bit整数
char[] System.Charの配列 (16bit) (2byte) UTF-16文字配列。[]の数字は配列のサイズ
byte[] System.Byteの配列 (8bit) (1byte) 最小の8bit整数。[]の数字は配列のサイズ

このような感じです。あと、名前は英語もプログラミングもまだまだなやつが適当に名づけたものなので注意。こうしたほうがいいというのがあったらコメントへ・・・

ほとんど、先ほどの2つのサイト様からのパクリ参考にしたものです。私の検証結果を書き足しているだけだと思ってください。

表示のスペース上、変に改行されてしまいます。すいません。英語名のほうの一部にはわざと改行を入れています。なのでコピーした際に改行が入ってしまう可能性があります。

始め 終わり 長さ .NET型 名前 英語名 説明(適当)
0x00 0x03 4 uint マジックナンバー MagicNumber ファイルの種類を特定する。うごメモでは必ず「PARA」になる。intで読み込んで0x41524150
0x04 0x07 4 uint アニメーションデータサイズ AnimetionSize アニメーションのサイズ。音楽とヘッダは含まれない
0x08 0x0B 4 uint 音楽データサイズ SoundSize 音楽のパートのデータサイズらしい
0x0C 0x0D 2 ushort フレーム数 frameLength フレームの数。ページ数-1なので注意。
0x0E 0x0F 2 ushort 不明 UnKnow 不明。0x0024の定数が入っている。個人的にはファイルバージョンあたりでは無いかと疑っている
0x10 0x11 2 ushort ロック Locked ロックなし => 0 、ロックあり => 1
0x12 0x13 2 ushort セーブフレーム SavedFrame 保存したページ番号。メモ一覧で表示されるサムネイルのページ番号。(ただしサムネイル画像自体は別データとして存在する)ページ番号と同じく、0から数える。。
0x14 0x29 22 char[11] 原作者名 Original
AuthorName
そのまま原作者名。UTF-16(LE)で格納される。あまった文字分はヌル文字(0)で埋められる。
0x2A 0x3F 22 char[11] 親作者名 Parent
AuthorName
親作者名。親が存在しない場合は自分自身。
0x40 0x55 22 char[11] 作者名 User
AuthorName
作者名。すなわち、このメモを最後に編集した人。英語名がUserAuthorとなんか不自然なのは許して
0x56 0x5D 8 ulog 親作者ID ParentAuthor
ID
親作者のID。マイルームの「http://ugomemo.hatena.ne.jp/01FD20D0AA348043@DSi/」の@DSiの前の部分に当たる。大文字の16進にすること
0x5E 0x65 8 ulong 作者ID UserAuthor
ID
作者のID。UserAuthorNameと同じく、最後に編集した人。
0x66 0x77 18 byte[18] 親作品ID ParentMemo
ID
親作品のID。このデータからファイル名を取得できる。詳しくは下へ。
0x78 0x89 18 byte[18] この作品のID MemoID この作品のID。上と同じく下を参照。
0x8A 0x91 8 ulong 原作者ID OriginalAuthor
ID
上の作者IDと同様のID。なぜこれだけ離れているのだろうか。
0x92 0x99 8 byte[8] 部分ファイル名 PartialFile
Name
詳細不明。Wikiよりそのまま引用。詳しくはノートを見ろって、どれ?
0x9A 0x9D 4 uint 更新日時 TimeStamp 2000年1月1日0時0分0秒からの秒数。.NETではDateTimeで2000年1月1日のインスタンスを作って、AddSecondsで秒を加算すればよい。
0x9E 0x9F 2 ushort 空白 filter 常に00っぽい。Wikiによると、フィルタらしい。違った。fillerだった。たはりアドレスをきりよくさせるための隙間だ。予約領域の可能性もある。


ヘッダ情報はとりあえずココまで。
この後にメモ一覧で表示されるサムネイル(Wikiではプレビュービットマップ)がある。まだ研究していないがそのうちやってみる予定。


そして、byte配列で受け取った作品ID。そこからファイル名を読み取る。


先頭3byte : ファイル名の1セクション目。16進数に変換する。
中央13byte: ファイル名の2セクション目。ASCIIとしてエンコードする
最終2byte : ファイル名の3セクション目。3桁の10進として変換する(0埋め)。たぶん、999まで対応していると思われる。それ以降の大きさになった場合の動作は不明
わかりにくかったらコメントで聞いてください。



それで、結局それをC#のクラスにがんばってまとめました。近日公開。