私は生のバイナリデータブロックを持っています(実際にはCBOR
- エンコードされています)。このソリューションは、x86/x86_64
PCとarm/arm64
のiOS上で動作バイナリデータ、クロスプラットフォーム(C/C++)から数値を読み取る方法は?
template <typename T> // T can be uint64_t, double, uint32_t, etc...
auto read(const uint8_t *ptr) -> T {
return *((T *)(ptr)); // all endianess-aware functions will be performed later
}
:のような数値を読み取るには、私は一般的な形式を使用します。 しかし、arm/armv7
のAndroidでは、デフォルトのリリース最適化レベル(-Os
)でclang
コンパイラを使用していますが、1
(アライメントのない読み取り)のSIGBUS
があります。私は別のソリューションとその問題を解決:
template <typename T>
auto read(const uint8_t *ptr) -> T {
union {
uint8_t buf[sizeof(T)];
T value;
} u;
memcpy(u.buf, ptr, sizeof(T));
return u.value;
}
は、あらゆるプラットフォームに依存しないソリューションはあり、それがパフォーマンスに影響を与えないのだろうか?
私はそれはおそらくあなたが得る限り良いことだと思います。 –
未定義の振る舞いの再解釈の代わりに、適切な(デ)直列化を使用してください。あなたはすでにいくつかの問題に遭遇しました。 – Olaf