Pregunta

Tengo problemas para comunicar las coordenadas de la posición a un conjunto de motores que he conectado en la red.Puedo enviar una cadena bien, y recibir texto de regreso del motor, pero parece que no puedo enviarlo un valor INT.

Usando NSLOG He determinado que el valor real que estoy enviando es correcto, sin embargo, sospecho que mi método para enviarlo a través del flujo de salida está incorrecto.¿Algunas ideas?

Mi código para enviar un 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]];

¿Fue útil?

Solución

Bueno, tus códigos se ven poco divertidos.De todos modos, para enviar un entero binario a través de la red, debe conocer la endiaisa: el receptor espera a los enteros pequeños o grandes endian.

Aquí está el 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)];

Otros consejos

Probablemente estés viendo un problema de endianness.Los CPU de Intel son Little-Endian , lo que significa que el byte menos significativo en un valor de múltiples bytes se almacena primero, el último byte significativo.Leer un número de 8 bytes de la memoria y ponerlo en la red sin hacer nada hará que los bytes salgan a ese orden.

La mayoría de los protocolos de red (incluidos todos los protocolos de Internet) esperan Big-Endian datos, por lo que el byte más significativo aparece en la red primero y el último byte significativo.¿Espera su protocolo de red?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top