Pergunta

C / C ++, se um valor de multi-byte caractere largo (wchar_t) é transmitido a partir de um sistema de grande-endian para um sistema pequeno-endian (ou vice-versa), vai sair o mesmo valor, por outro lado? Ou será que os bytes precisa ser trocada?

Foi útil?

Solução

Sim, você terá que trocá-los.
Os bytes serão recuperados do transporte na mesma ordem em que foram colocados. Apenas na outra extremidade a ordenação destes bytes tem um significado diferente. Então, você precisa convertê-los para o endian-ness correta (que é uma palavra?).

O método experimentado e verdadeiro é converter a rede byte ordem antes do transporte. Em seguida, converter de volta para byte ordem específica host (a partir de rede byte ordem) no recebimento.

Um conjunto de função para ajudar com a conversão endian:

ntohs   Convert a 16-bit quantity from network byte order to host byte order
ntohl   Convert a 32-bit quantity from network byte order to host byte order
htons   Convert a 16-bit quantity from host byte order to network byte order
htonl   Convert a 32-bit quantity from host byte order to network byte order

Só para acrescentar outra nota de cautela.
Diferentes sistemas usam tamanho diferente para wchar_t portanto, não assumem sizeof (wchar_t) == 2.

Além disso, cada host pode usar um formato de representação diferente para wchar_t.
Para ajudar a lidar com esta maioria dos sistemas de converter o texto em um formato conhecido para o transporte (UTF-8 ou UTF-16 são boas escolhas). O convertido parte de trás de texto para o formato específico de acolhimento na outra extremidade.

Você pode olhar para UTI da IBM isso tem toda esta funcionalidade.

Outras dicas

conversão Endian não é suficiente e, como consequência não é necessário. Sizeof (wchar_t) difere, e, por conseguinte, a codificação também. Daí, você precisa concordar com um formato de intercâmbio. A escolha lógica é UTF-8. Mas desde que UTF-8 é orientada a byte, você não tem mais problemas endianness.

Sim, você precisa executar a conversão endian. Definir cuidadosamente o seu formato de serialização, ou seja, a ordem de bytes de dados que são transmitidos através da rede ou armazenados em um arquivo de disco. Então, quando o envio de dados, convertido do formato nativo para fio (pode ou não pode necessitar de byte de troca), e quando a recepção de dados, convertido a partir de arame para o formato nativo (mais uma vez pode ou não exigir a troca de bytes). Você deve escolher um formato de fio que será usado pela maioria dos clientes para minimizar a quantidade média de troca de bytes.

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