Как преобразовать 24-разрядное целое число в 3-байтовый массив?
-
09-10-2019 - |
Вопрос
Эй, я совершенно не в глубине, и мой мозг начинает причинять боль .. :(
Мне нужно скрыть целое число, чтобы оно поместилось в массиве 3 байтов.
У меня есть:
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 правильно, который является преобразованием, который мне нужно сделать, а также для отправки данных.
Любая помощь очень ценится!
Решение
Вы можете использовать профсоюз:
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]
преобразовать из байтов в 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
Примечание. Использование профсоюзов таким образом зависит от байтора. Пример, который я дал, будет работать над системой небольшой эндианской системы (например, x86).
Другие советы
Предположим, у вас есть 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];
И, да, я полностью осознаю, что есть более оптимальные способы сделать это. Цель в вышеизложенном - ясность.
Как насчет небольшого обмана?
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
Вероятно, есть вещи, о которых нужно позаботиться, если вы собираетесь использовать это в производственном коде, но основная идея вменяется.