Frage

Hey Im völlig aus meiner Tiefe und mein Gehirn zu verletzen beginnt ..: (

ich brauche eine ganze Zahl verdeckte so dass es in einem 3-Byte-Array passen. (Ist, dass ein 24-Bit-int?) Und dann wieder zurück zu senden / empfangen diese Nummer von einem Byte-Strom durch eine Buchse

ich habe:

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

Ich denke, mein Hauptproblem ist, dass ich weiß nicht, wie zu überprüfen, dass ich in die Tat meiner int richtig umgesetzt, die die Umwandlung zurück ist, dass ich die Daten auch tun, für das Senden.

Jede Hilfe sehr geschätzt!

War es hilfreich?

Lösung

You could use a union:

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

to convert from int to bytes:

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

to convert from bytes to 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

Note: using unions in this manner relies on processor byte-order. The example I gave will work on a small-endian system (like x86).

Andere Tipps

Assume you have a 32-bit integer. You want the bottom 24 bits put into a byte array:

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;

To convert the 3 bytes back to an integer:

// 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];

And, yes, I'm fully aware that there are more optimal ways of doing it. The goal in the above is clarity.

How about a bit of pointer trickery?

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

There are probably things to be taken care of, if you are going to use this in production code, but the basic idea is sane.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top