Можете ли вы объяснить, как преобразовать последние 3 байта данных из целых чисел без знака в массив символов?преобразовать целое число без знака в массив байтов в C
Пример:
unsigned int unint = some value;
unsigned char array[3];
Можете ли вы объяснить, как преобразовать последние 3 байта данных из целых чисел без знака в массив символов?преобразовать целое число без знака в массив байтов в C
Пример:
unsigned int unint = some value;
unsigned char array[3];
Это более сложно, если вы должны преобразовать его в массив, но если вы просто хотите, чтобы получить доступ к отдельным байт, то вы можете сделать
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;
+1, но зачем вам «& 0xFF»? – rubndsouza
Вы можете сделать это, используя побитовое правильный оператор сдвига:
array[0] = unint;
array[1] = unint >> 8;
array[2] = unint >> 16;
Наименьшее байт приобретает важное uint
хранится в первом элементе массива.
В зависимости от ваших потребностей, вы можете предпочесть союз:
typedef union {
unsigned int unint;
unsigned char array[3];
} byteAndInt;
или бит сдвига операции:
for(int i=0; i<3; i++)
array[i] = (unint>>8*i) & 0xFF;
Прежний не обратный порядок байт-сейф.
Разве это не UB, чтобы написать одному члену профсоюза и прочитать другой, не написав сначала? –
@Seth UB по стандарту, но четко определен всеми компиляторами, с которыми я когда-либо сталкивался. –
Объединение указывает, что одну и ту же область памяти можно интерпретировать несколькими способами. В этом и заключается цель написать одно поле и прочитать другое. Разумеется, выполнение одного и того же кода на большой машине и на маленьком-endian дает разные результаты. но это проблема переносимости, а не UB. – mouviciel
Если на трех последних, вы имеете в виду LSB + 1, LSB + 2 и MSB (другими словами, каждый байт, кроме LSB), то вы можете использовать это.
unsigned int unint = some value;
unsigned char * array = ((unsigned char*)&some_value) + 1;
Что вы подразумеваете под * последними тремя байтами *? –
Я думаю, он имеет в виду наименее значимые 3 байта, но я могу ошибаться. – Nick