У меня есть необработанные двоичные блоки данных (на самом деле, CBOR
-encoded). Для чтения числового я использую общий вид, как:Как читать числовые данные из двоичных данных, кроссплатформенность (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
}
Это решение работает на x86/x86_64
ПК и arm/arm64
IOS. Но, на arm/armv7
Android с clang
компилятор на уровне оптимизации по умолчанию по умолчанию (-Os
) Я получаю SIGBUS
с кодом 1
(неглавное чтение) для типов, больше одного байта. Я исправляю эту проблему с другим решением:
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;
}
Есть ли какое-либо независимое от платформы решение, которое не повлияет на производительность?
Я думаю, что это, вероятно, так же хорошо, как вы получите. –
Используйте правильную сериализацию (de) вместо этих неопределенных переопределений поведения. Вы столкнулись с некоторыми проблемами, может быть и больше. – Olaf