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]];
Foi útil?

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?

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