Question

Hey Im totalement hors de ma profondeur et mon cerveau commence à mal ..: (

Je dois convertir un entier afin qu'il s'adapter dans un tableau 3 octets. (Est-ce un 24bit int?), Puis de nouveau pour envoyer / recevoir ce numéro à partir d'un flux d'octets via un socket

Je:

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

Je suppose que mon principal problème est que je ne sais pas comment vérifier que je l'ai en effet de convertir mon int correctement qui est le dos de conversion que je dois faire aussi bien pour envoyer les données.

Toute aide grandement appréciée!

Était-ce utile?

La solution

Vous pouvez utiliser une union:

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

pour convertir int en octets:

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

pour convertir les octets 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

Remarque: L'utilisation des syndicats de cette manière repose sur l'ordre des octets du processeur. L'exemple que j'ai donné fonctionnera sur un système petit-endian (comme x86).

Autres conseils

Supposons que vous avez un nombre entier de 32 bits. Vous voulez que les 24 bits inférieurs mis dans un tableau d'octets:

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;

Pour convertir les 3 octets de retour à un nombre entier:

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

Et, oui, je suis tout à fait conscient qu'il existe des moyens plus optimaux de le faire. L'objectif dans ce qui précède est la clarté.

Que diriez-vous d'un peu de ruse pointeur?

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

Il y a probablement des choses à prendre en charge, si vous allez utiliser dans le code de production, mais l'idée de base est sain d'esprit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top