Escrevendo valor int de 64 bits em NSOutputStream
-
15-09-2020 - |
Pergunta
Estou tendo problemas para comunicar as coordenadas de posição a um conjunto de motores que conectei na rede.Posso enviar uma string perfeitamente e receber o texto de volta do motor, mas não consigo enviar um valor int.
Usando o NSlog, determinei que o valor real que estou enviando está correto, mas suspeito que meu método de enviá-lo por meio do fluxo de saída esteja errado.Alguma ideia?
Meu código para enviar um valor int de 64 bits:
uint64_t rawInt = m1;
rawInt <<= 16;
rawInt |= m2;
NSData *buffer = [NSData dataWithBytes: &rawInt length:8];
[outputStream write: [buffer bytes] maxLength:[buffer length]];
Solução
Bem, seus códigos parecem engraçados.De qualquer forma, para enviar um número inteiro binário pela rede, é necessário conhecer o endianess:O receptor espera números inteiros endian pequenos ou grandes.
Aqui está o código para ambos:
uint64_t myInt = 42;
uint64_t netInt = CFSwapInt64HostToLittle(myInt); // use this for little endian
uint64_t netInt = CFSwapInt64HostToBig(myInt); // use this for big endian
[outputStream write:(uint8_t*)&netInt maxLength:sizeof(netInt)];
Outras dicas
Você provavelmente está vendo um problema de endianness.CPUs Intel são pequeno endian, o que significa que o byte menos significativo em um valor multibyte é armazenado primeiro e o byte mais significativo por último.Ler um número de 8 bytes da memória e colocá-lo na rede sem fazer nada fará com que os bytes saiam nessa ordem.
A maioria dos protocolos de rede (incluindo todos os protocolos de Internet) espera big endian dados, de forma que o byte mais significativo apareça primeiro na rede e o byte menos significativo por último.O seu protocolo de rede espera isso?