Scrivere il valore INT a 64 bit per NSoutputStream
-
15-09-2020 - |
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]];
. 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?