うごメモの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ではプレビュービットマップ)がある。まだ研究していないがそのうちやってみる予定。
そして、byte配列で受け取った作品ID。そこからファイル名を読み取る。
わかりにくかったらコメントで聞いてください。
先頭3byte : ファイル名の1セクション目。16進数に変換する。
中央13byte: ファイル名の2セクション目。ASCIIとしてエンコードする
最終2byte : ファイル名の3セクション目。3桁の10進として変換する(0埋め)。たぶん、999まで対応していると思われる。それ以降の大きさになった場合の動作は不明
それで、結局それをC#のクラスにがんばってまとめました。近日公開。