Вопрос

У меня есть

_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) и т. Д. Для выполнения сменов. Конечно, ничего не повредит.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top