Я думаю, что запутался с порядком байтов и сдвигом битов, пожалуйста, помогите.
У меня есть 4 8-битных целых числа, которые я хочу преобразовать в 32-битное целое число. Вот что я делаю:
uint h;
t_uint8 ff[4] = {1,2,3,4};
if (BIG_ENDIAN) {
h = ((int)ff[0] << 24) | ((int)ff[1] << 16) | ((int)ff[2] << 8) | ((int)ff[3]);
}
else {
h = ((int)ff[0] >> 24) | ((int)ff[1] >> 16) | ((int)ff[2] >> 8) | ((int)ff[3]);
}
Однако это, кажется, дает неверный результат. Немного поэкспериментировав, я понял, что должно быть наоборот: в случае с прямым порядком байтов я должен сдвигать биты вправо, а в противном случае — влево. Однако я не понимаю, ПОЧЕМУ.
Вот как я это понимаю. Big endian означает, что старший байт идет первым (первый означает самый левый, правый? Возможно, здесь я ошибаюсь). Итак, преобразование 8-битного int в 32-битное int добавило бы 24 нуля к моим существующим 8 битам. Итак, чтобы сделать его 1-м байтом, мне нужно сдвинуть 24-й бит влево.
Пожалуйста, укажите, где я ошибаюсь.
ff[0] >> 24
? Сделайте это вручную и посмотрите на результат. Это правильно? - person hyde   schedule 23.02.2014