2012-01-24 4 views
3

Можете ли вы объяснить, как преобразовать последние 3 байта данных из целых чисел без знака в массив символов?преобразовать целое число без знака в массив байтов в C

Пример:

unsigned int unint = some value; 
unsigned char array[3]; 
+6

Что вы подразумеваете под * последними тремя байтами *? –

+0

Я думаю, он имеет в виду наименее значимые 3 байта, но я могу ошибаться. – Nick

ответ

5

Это более сложно, если вы должны преобразовать его в массив, но если вы просто хотите, чтобы получить доступ к отдельным байт, то вы можете сделать

char* bytes = (char*)&unint; 

Если вы действительно хотите создать массив (и, следовательно, сделать копию последних 3 байтов, не оставляя их на месте), вы делаете

unsigned char bytes[3]; // or char, but unsigned char is better 

bytes[0] = unint >> 16 & 0xFF; 
bytes[1] = unint >> 8 & 0xFF; 
bytes[2] = unint  & 0xFF; 
+0

+1, но зачем вам «& 0xFF»? – rubndsouza

5

Вы можете сделать это, используя побитовое правильный оператор сдвига:

array[0] = unint; 
array[1] = unint >> 8; 
array[2] = unint >> 16; 

Наименьшее байт приобретает важное uint хранится в первом элементе массива.

+0

Я вроде догадываюсь, что ему может понадобиться представление значений ASCII ... – Nick

+0

@Nick В массиве символов длиной 3? –

+0

Dunno - это было просто догадка! – Nick

0

В зависимости от ваших потребностей, вы можете предпочесть союз:

typedef union { 
    unsigned int unint; 
    unsigned char array[3]; 
} byteAndInt; 

или бит сдвига операции:

for(int i=0; i<3; i++) 
    array[i] = (unint>>8*i) & 0xFF; 

Прежний не обратный порядок байт-сейф.

+0

Разве это не UB, чтобы написать одному члену профсоюза и прочитать другой, не написав сначала? –

+0

@Seth UB по стандарту, но четко определен всеми компиляторами, с которыми я когда-либо сталкивался. –

+0

Объединение указывает, что одну и ту же область памяти можно интерпретировать несколькими способами. В этом и заключается цель написать одно поле и прочитать другое. Разумеется, выполнение одного и того же кода на большой машине и на маленьком-endian дает разные результаты. но это проблема переносимости, а не UB. – mouviciel

0

Если на трех последних, вы имеете в виду LSB + 1, LSB + 2 и MSB (другими словами, каждый байт, кроме LSB), то вы можете использовать это.

unsigned int unint = some value; 
unsigned char * array = ((unsigned char*)&some_value) + 1; 
Смежные вопросы