Конвертировать 4-байтовые символы в int32 в C - PullRequest
14 голосов
/ 17 ноября 2011

Сначала я конвертирую число int32 в массив char [4], затем преобразовываю массив обратно в int32 с помощью (int *), но число не такое, как раньше:

unsigned int num = 2130706432;
unsigned int x;
unsigned char a[4];

a[0] = (num>>24) & 0xFF;
a[1] = (num>>16) & 0xFF;
a[2] = (num>>8) & 0xFF;
a[3] = num & 0xFF;

x = *(int *)a;
printf("%d\n", x);

на выходе 127. И если я установлю num = 127, на выходе будет 2130706432. У кого-нибудь есть идеи?

Ответы [ 4 ]

17 голосов
/ 17 ноября 2011

Обратный порядок индексов a [], например ,. a [0] -> a [3]

Я думаю, у вас обратный порядок байтов.

Попробуйте это:

a[3] = (num>>24) & 0xFF;
a[2] = (num>>16) & 0xFF;
a[1] = (num>>8) & 0xFF;
a[0] = num & 0xFF;
9 голосов
/ 17 ноября 2011

Чтобы увидеть, что происходит, используйте

printf("%x\n", ...);

для печати как входного, так и выходного номера.

Порядковый путь:

x = (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3];
5 голосов
/ 17 ноября 2011

Ваш код a[0] = (num>>24) & 0xFF; берет 8 старших разрядов из num и вставляет их в первый байт a. На машинах с прямым порядком байтов первый байт содержит младшие биты. Это означает, что на машинах с прямым порядком байтов этот код берет 8 старших значащих битов и сохраняет их там, где идут младшие значащие биты, изменяя значение.

2130706432 - 0x7F000000 в шестнадцатеричном формате, а 127 - 0x0000007F.

Кроме того, x = *(int *)a; приводит к неопределенному поведению. Рассмотрим оборудование, в котором чтение int с неправильно выровненного адреса вызывает ошибку шины. Если a не будет правильно выровнено для int, то программа завершится сбоем.

Правильный подход к интерпретации байтов как int был бы std::memcpy(&x, a, sizeof x);

2 голосов
/ 17 ноября 2011

Эта строка никогда не будет работать правильно на машине с прямым порядком байтов:

x = *(int *)a;

Вам необходимо распаковать данные, прежде чем распечатать значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...