Domanda

Hey Im totalmente fuori dalla mia profondità e il mio cervello sta cominciando a male ..: (

Ho bisogno di convertire un numero intero in modo che si adatti in una matrice 3 byte. (Che è un int 24bit?) E poi di nuovo per inviare / ricevere questo numero da un flusso di byte attraverso una presa

ho:

NSMutableData* data = [NSMutableData data];

 int msg = 125;

 const void *bytes[3];

 bytes[0] = msg;
 bytes[1] = msg >> 8;
 bytes[2] = msg >> 16;

 [data appendBytes:bytes length:3];

 NSLog(@"rtn: %d", [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] intValue]);

 //log brings back 0

Credo che il mio problema principale è che non so come verificare che in effetti ho trasformato il mio int correttamente, che è la parte posteriore di conversione che ho bisogno di fare pure per l'invio dei dati.

Qualsiasi aiuto molto apprezzato!

È stato utile?

Soluzione

Si potrebbe usare un sindacato:

union convert {
    int i;
    unsigned char c[3];
};

convertire da int a byte:

union convert cvt;
cvt.i = ...
// now you can use cvt.c[0], cvt.c[1] & cvt.c[2]

convertire da byte a int:

union convert cvt;
cvt.i = 0; // to clear the high byte
cvt.c[0] = ...
cvt.c[1] = ...
cvt.c[2] = ...
// now you can use cvt.i

Nota: utilizzando i sindacati in questo modo si basa su processore ordine di byte. L'esempio che ho dato lavorerà su un piccolo-endian sistema (come x86).

Altri suggerimenti

Si supponga di avere un intero a 32 bit. Si desidera che i 24 bit di fondo messi in un array di byte:

int msg = 125;
byte* bytes = // allocated some way

// Shift each byte into the low-order position and mask it off
bytes[0] = msg & 0xff;
bytes[1] = (msg >> 8) & 0xff;
bytes[2] = (msg >> 16) & 0xff;

Per convertire i 3 byte ritorna un numero intero:

// Shift each byte to its proper position and OR it into the integer.
int msg = ((int)bytes[2]) << 16;
msg |= ((int)bytes[1]) << 8;
msg |= bytes[0];

E, sì, sono pienamente consapevole che ci sono modi più ottimali di farlo. L'obiettivo in quanto sopra è la chiarezza.

Che ne dite di un po 'di puntatore inganno?

int foo = 1 + 2*256 + 3*65536;
const char *bytes = (const char*) &foo;
printf("%i %i %i\n", bytes[0], bytes[1], bytes[2]); // 1 2 3

Probabilmente ci sono cose da prendere cura di, se avete intenzione di utilizzare questo nel codice di produzione, ma l'idea di base è sano di mente.

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