От 4x8 битных до 32-битных целых - PullRequest
2 голосов
/ 16 января 2011

у меня

_int8 arr[0] = 0;
_int8 arr[1] = 0;
_int8 arr[2] = 14;
_int8 arr[3] = 16;

Мне нужно преобразовать его в один _int32, используя как arr [0] в качестве первой части <..> и arr [3] в качестве последней. В конце это должно быть

_int32 back = 3600;

Должен ли я использовать сдвиги в битах или что-то подобное для достижения этой цели?

Ответы [ 3 ]

8 голосов
/ 16 января 2011

Приведите их к 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];
4 голосов
/ 16 января 2011

Если вы знаете порядок байтов (т. Е. С прямым или прямым порядком байтов, проверьте его в Википедии), и массив настроен в правильном порядке, вы можете просто сделать:

back = *(_int32 *)arr;

То 'Я просто интерпретирую ваш массив из 4 байтов как буфер, содержащий одно 32-битное целое число.Хотя в вашем примере, я думаю, что вы настроили его на big endian, а x86 - нет.Поэтому вам нужно поменять местами несколько байтов.

Например:

_int32 back = arr[0] << 24 | arr[1] << 16 | arr[2] << 8 | arr[3];

или что-то в этом роде.

1 голос
/ 16 января 2011

Вероятно, это мой компилятор SCO, но я думаю, что у меня были проблемы, если я не использовал (arr [0] & 0xff) и так далее для выполнения смен.Конечно, ничего не повредит.

...