Domanda

Ho difficoltà a comunicare le coordinate di posizione in una serie di motori che ho collegato sulla rete.Posso inviare una stringa bene, e ricevere un messaggio dal motore, ma non riesco a inviarlo un valore int.

Utilizzando NSLOG Ho determinato che il valore effettivo che sto inviando è corretto, tuttavia sospetto il mio metodo di invio tramite il flusso di uscita è sbagliato.Qualche idea?

Il mio codice per inviare un valore INT a 64 bit:

uint64_t rawInt = m1; 
rawInt <<= 16; 
rawInt |= m2;
NSData *buffer = [NSData dataWithBytes: &rawInt length:8];
[outputStream write: [buffer bytes] maxLength:[buffer length]];
.

È stato utile?

Soluzione

Bene, i tuoi codici sembrano divertenti.Ad ogni modo, per l'invio di un intero binario sulla rete, devi conoscere l'endonessa: il ricevitore si aspetta piccoli o grandi numeri interi endian.

Ecco il codice per entrambi:

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)];
.

Altri suggerimenti

Probabilmente stai vedendo un problema dell'endiano.Intel CPU sono Little-Endian , il che significa che il byte meno significativo in un valore multi-byte viene memorizzato in primo luogo, il byte più significativo per ultimo.Leggere un numero di 8 byte dalla memoria e mettendolo sulla rete senza fare nulla farà uscire i byte in quell'ordine.

La maggior parte dei protocolli di rete (compresi tutti i protocolli Internet) si aspettano Big-endian dati, quindi il byte più significativo appare prima sulla rete e il middle minimo significativo.Il tuo protocollo di rete si aspetta che?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top