A representação binária de tipos nativos é a mesma garantida em todos os alvos?
-
26-09-2019 - |
Pergunta
Estou planejando armazenar meus dados em um formato binário como recurso, leio -os em um buffer int e basicamente o passa diretamente para uma função C ++ nativa, que pode lançá -lo para uma estrutura/classe e trabalhar com ele. Sem ponteiros , obviamente, apenas ints e flutuadores.
A questão é - que tipo de consertar eu preciso fazer? Suponho que preciso verificar ByteOrder.nativeOrder()
, descubra se é Big Endian ou Little Endian e faça troca de bytes, se necessário.
Fora isso, presumivelmente é garantido que os carros alegóricos são esperados no formato IEEE 754? Existem outras advertências que estou completamente negligenciando aqui?
(Também - como estou compilando usando o NDK, sei que arquitetura já é (ARMV7 -A, no meu caso), então posso tecnicamente pular as travessuras Endian e apenas pegar os dados da maneira que é?)
Solução
Suporte ao braço Big e Little Endian. Provavelmente, isso será definido pelo sistema operacional, por isso pode valer a pena verificar isso de antemão.
Há também a questão do preenchimento no tamanho da palavra em uma estrutura:
struct st
{
char a;
int b;
};
terá um sizeof
8 e não os 5 bytes esperados. Isso é para que o int seja alinhado com a palavra. Geralmente alinham tudo a 4 bytes e provavelmente usam o atributo embalado do GCC (struct my_packed_struct __attribute__ ((__packed__))
) também. Isso garantirá que os internos da estrutura sejam como você espera.
Alternativamente, use o simulador Android para gerar o arquivo de dados para você.