DATE : 2006/10/26 (Thu)
BREW アプリケーションに使うデータファイルとして、バイナリファイルを作ろうとしていたらミスしてしまいました orz
BREW アプリケーションを実行する CPU は、PC とは異なり ARM を使用します。そのため、バイナリファイルを作る上でいろいろと考えなければならないことが出てきます。
例えば、バイトデータを配置する方式のエンディアン。開発機の PC に使われていることが多い x86 系 CPU ではリトルエンディアンですが、ARM アーキテクチャの場合はリトルエンディアン、ビッグエンディアンの両方が混在しているようです。実際、BREW を実行する実機のエンディアンは機種依存になっています。
しかし、BREW API には、実機のエンディアンにバイト列を変換する関数が用意されています。そのため、バイナリファイルのエンディアンを定めておけば、この点は特に問題になりません。
この問題には早々から気付いていたので簡単に解決できたのですが、もうひとつの問題となる、値のビット幅には見落としてしまいました orz
BREW API では、整数型のビット幅は型によって規定されています。つまり、「int32」や「uint16」という型が定められており、それぞれ32ビット整数型、16ビット符号なし整数型を表しています。
しかし、浮動小数点に関しては、ビット幅が定められていません。ただ単に、「double」という型があるだけです(BREW では、float は使えません。浮動小数点を扱う際には、double を使うことになります)。C や C++ において、double 型のビット幅は機種依存です。
そのことを、double 値を書き出すバイナリファイルの仕様を策定して実装している最中に気が付きました orz
(;^ω^)バイナリファイルを書き出すプログラムは Java で作っていたので、余計に気付きにくかったのかもしれません。(Java の場合、double 型は64ビットと決められています)
とりあえず考えてみた解決方法は以下の通りです。
- 浮動小数点を文字列として書き出す(BREW API には、文字列を解析して double 型に変換する関数があります)
- 固定小数点数にして、整数型として書き出す