2010-12-07 3 views
2

Hey Im полностью из моей глубины, и мой мозг начинает болеть .. :(Как преобразовать 24-разрядное целое число в 3-байтовый массив?

Мне нужно скрыть целое число, чтобы оно поместилось в 3-байтовый массив (это то, что 24-битное int?) И затем снова отправить/получить этот номер из потока байтов через сокет

у меня есть:

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 

Я думаю, что моя главная проблема в том, что я не знаю, как проверить, что я на самом деле превращают мой int, который является преобразованием, которое мне также нужно сделать для отправки данных.

Любая помощь очень ценится!

ответ

1

Вы можете использовать союз:

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

для преобразования из INT в байтах:

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

для преобразования из байтов в целое:

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 

Примечание: использование союзов в этот способ зависит от байтового байта процессора. Пример, который я дал, будет работать в малой системе (например, x86).

0

Как насчет немного обмана?

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 

Есть, вероятно, вещи, которые будут заботиться, если вы собираетесь использовать это в рабочем коде, но основная идея заключается в здравом уме.

6

Предположим, что у вас есть 32-разрядное целое число. Вы хотите, чтобы нижние 24 бит поместить в массив байтов:

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; 

Чтобы преобразовать 3 байта обратно в целое число:

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

И, да, я прекрасно понимаю, что есть более оптимальный способы сделать это. Целью вышеизложенного является ясность.

+0

+1 это нецелесообразно, что является хорошим. – JeremyP 2010-12-07 15:39:27

+0

Это работает нормально, пока число составляет <255. Я собираю это максимальное значение для 24-битного int? – loststudent 2010-12-08 10:02:48