技術解説
目次
データ構造
それでは、データの内部構造にうつります。
基本的には、文字列の繰り返しですが、直前や直後に数値が入る場合があります。
なので、以下出てくる文字列を順に「n番目データ」とし、n=0 からはじめます。
以下の説明では 6番目まで説明していますが、最後のデータは「文字列長 -1」となっているようです。つまり、6番目まで存在している場合、データは7番目まで存在します。
逆に。後ろのほうのデータが無い場合、5番目や4番目でデータが終了することもあります。データは6番目まで、と決め打ちせず、バイナリデータの最後まで読み取ったら終了するようにしてください。
先頭、0番目として、android.content.Intent という固定文字列が入ります。これは、Intent のデータであることを明示するものです。
つづいて1番目。行動が文字列で入ります。
2番目の前には、数値で「フラグ」が入ります。このフラグの数値により、2番目が「データ」か「データタイプ」かが決定されます。
フラグが 0 のときはデータタイプです。1のときは、データになります。
データの場合のみ、文字列直後にパディング数値が来ます。
3番目の前にもパディング数値が入ります。
3~5番目は、関係が少し複雑です。ここには、パッケージと、その下位概念であるクラスが格納されます。
パッケージのみが指定された場合、3番目として格納されます。
クラス指定がある場合、4番目がパッケージ、5番目がクラスとなります。
文字列長が -1 の場合、「存在しない」ことを意味します。3番目データが存在しなければ、パッケージは4番目に格納されています。
4番目が存在しなければ、クラスのデータは完全に存在しません。5番目を飛ばして、4番目の次が6番目となります。
クラスデータのみ存在する場合、3番目の文字列長は -1 、4番目の文字列長は 0 となり、5番目にクラスが格納されます。
6番目の前には、パディングとフラグの 2つの数値が入ります。
フラグが1のときのみ、6番目にカテゴリーが格納されています。
7番目は、Extras データです。これは非常に長い文字列として、先頭に長さが入る形で扱われますが、実際はバイナリです。詳細は後述します。
以上ですべてのデータがそろいます。
…データの後ろのみ存在する数値とか、やたらパディングが多かったりとか、まだ「何かありそう」な予感がぷんぷんしますが、とりあえずは以上のデータを読み出せば表示は出来るはずです。
Extras データ
Extras のデータは、Intent のデータ構造内では「文字列」のように格納されています。しかし、実際にはバイナリです。
中身は、やはり UTF-16 の LASCIIZ 文字列と、32bit 数値の組み合わせになっています。
以下に構造を示します。
先頭には、 32bit 数値が入っています。4byte のデータとして ASCII 文字にすると BNDL です。これが Extras のバンドルデータであることを示しているようです。
つづいて、32bit 数値。このバイナリ内のデータの個数を示します。
さらに、32bit 数値。パディングです。もしくは、 0 によってヘッダの終了を示しているのかもしれません。
以下、個々のデータが連続して入ります。
key 文字列、型を示す数値、Value 、最後に数値として 0 がパディングで入ります。
この4つが1セットで、冒頭に示されたデータの個数続きます。
もっとも、Extras データは文字列と同じ扱いで格納されているため、バイナリの外側に終端文字の 0 が入ります。
データのサイズは型によって異なります。
型は 0:string 1:int 5:short 6:long 7:float 8:double 0x14:byte となっているようです。
string では、LASCIIZ 文字列で value を格納します。
int、 short および byte は、32bit 数値として格納されています。
long は、32bit 数値を2つ連続させることで 64bit を格納します。
float は 32bit 数値、double は 64bit 数値ですが、内部は IEEE754 浮動小数のビット表現です。
日本語について
自分で言うのもなんですが、今回このようなプログラムを作ってみて、日本語訳がひどいな、と思いました (^^;
言い訳させてもらえば、全体を翻訳しているときはテキストが膨大な量で、細かな部分を見る余裕がなかったんですね。
今回、イベント表示部分に特化して見直したら、同じことを書いているのに表記がゆれていたり、誤字脱字を見つけたり、明らかな誤訳を見つけたり…
元のテキストを出来るだけそのまま訳したがために、意味が非常にわかりにくくなっている部分、というのも多数見つかりました。
また近いうちに改訂版を作って作者さんに送らないといけないかな。
追加された新機能の和訳も入れたいし。