ネイティブ型のバイナリ表現は、すべてのターゲットで同じことが保証されていますか?
-
26-09-2019 - |
質問
私は "メートルの計画は、int型のバッファにそれを読んで、資源としてバイナリ形式で自分のデータを格納し、基本的にはそれで構造体/クラスと仕事にキャストかもしれないネイティブC ++関数にまっすぐにそれを渡すためにいいえポインタ、明らかに、ちょうどint型や山車ます。
質問です - どのような私は何をする必要がありますアップ固定の?私はそれがビッグエンディアンかリトルエンディアンだ場合、数字をByteOrder.nativeOrder()
をチェックアウトし、バイトスワップ必要であれば実行する必要があるとします。
それ以外は、フロートはおそらくIEEE 754形式に期待されることが保証されていますか?私は完全にここに見下ろすてる他の注意点はありますか?
(また - 私はNDKを使用してコンパイルしてるから、私はそれが既にある(のARMv7-Aは、)私の場合、私は技術的にエンディアンペテンをスキップすることができますし、データだけにそれはある方法を取るどのようなアーキテクチャを知っていますか? )
解決
ARMはビッグエンディアンとリトルエンディアンの両方をサポートしています。事前にこれを確認しながら、それは価値があるかもしれませんので、これはおそらくOSによって設定されます。
また、構造体のワードサイズにパディングの問題があります:
struct st
{
char a;
int b;
};
sizeof
8とない5つのバイトを期待しています。 intはワード境界になるようにするためです。一般的に整列4バイトに至るまで、おそらく同様のgcc packed属性(struct my_packed_struct __attribute__ ((__packed__))
)を使用します。これは、あなたが期待するよう構造体の内部であることが保証されます。
またあなたのためのデータファイルを生成するために、Androidのシミュレータを使用します。