Pergunta

No Guia da Rede da Beej, há uma seção de dados de marechalling ou embalagem para serialização, onde ele descreve várias funções para empacotar e descompactar dados (int, float, duplo ..etc).

É mais fácil usar a união (semelhante pode ser definida para flutuar e dobrar), conforme definido abaixo e transmitir o número inteiro.

union _integer{
  char pack[4];
  int i;
}integer;
  1. Alguém pode ser um galpão sobre por que a união é uma má escolha?

  2. Existe algum método melhor de embalar dados?

Foi útil?

Solução

Computadores diferentes podem estabelecer os dados de maneira diferente. A edição clássica é Endianess (no seu exemplo, se o pacote [0] possui o MSB ou o LSB). Usar um sindicato como esse vincula os dados à representação específica no computador que o gerou.

Se você quiser ver outras maneiras de marcar dados, verifique o Aumentar a serialização e Google Protobuf.

Outras dicas

O truque da união não é garantido para funcionar, embora geralmente o faça. É perfeitamente válido (de acordo com o padrão) para você definir os dados de char e depois ler 0s quando você tenta ler o INT ou vice-versa. A União foi projetada para ser uma micro otimização de memória, não um substituto para a fundição.

Neste ponto, geralmente você envolve a conversão em um objeto útil ou usa reinterpret_cast. Um pouco volumoso ou feio ... mas nenhuma dessas coisas é necessariamente ruim quando você está comprando dados.

Por que não apenas fazer um reinterpret_cast para um char* ou a memcpy dentro de char amortecedor? Eles são basicamente a mesma coisa e menos confusos.

Sua ideia funcionaria, então vá em frente, se você quiser, mas acho que esse código limpo é um código feliz. Quanto mais fácil é entender o meu trabalho, menor a probabilidade de alguém (como o meu futuro) o quebrará.

Observe também que apenas os tipos de POD (dados antigos simples) podem ser colocados em um sindicato, o que coloca algumas limitações na abordagem da união que não estão lá em uma mais intuitiva.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top