4x8 -битный int до 32 -битного целого числа
Вопрос
У меня есть
_int8 arr[0] = 0;
_int8 arr[1] = 0;
_int8 arr[2] = 14;
_int8 arr[3] = 16;
Мне нужно преобразовать его в один _int32, используя ARR [0] в качестве первой части <..> и ARR [3] как последнее. В конце концов, это должно быть
_int32 back = 3600;
Должен ли я использовать бит -сдвиги или так, чтобы достичь этого?
Решение
Если вы знаете заказа байта (то есть Big Endian или Little Endian, проверьте его в Википедии), и массив настроен в правильном порядке, вы можете просто сделать:
back = *(_int32 *)arr;
Это просто интерпретирует ваш массив из 4 байтов как буфер, удерживающий одно 32-разрядное целое число. В вашем примере, я думаю, вы настроили его для Big Endian, а X86 - нет. Так что вам нужно поменять несколько байтов.
Например:
_int32 back = arr[0] << 24 | arr[1] << 16 | arr[2] << 8 | arr[3];
или что-то вроде того.
Другие советы
Бросить их int
Затем используйте:
(arr[0] << 24) | (arr[1] << 16) | (arr[2] << 8) | arr[3]
В качестве альтернативы:
_int32 back = 0;
for (int i = 0; i < 4; ++i)
back = (back << 8) | arr[i];
Вероятно, это мой компилятор SCO, но я думаю, что у меня были проблемы, если я не использовал (arr [0] и 0xff) и т. Д. Для выполнения сменов. Конечно, ничего не повредит.