Вот ваш набор из четырех символов:
const unsigned char buf[4] = { 'a', '0', '%', 'Q' };
Теперь мы собираем 32-разрядное целое число без знака:
const uint32_t n = (buf[0]) | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
Здесь я предполагаю, что buf[0]
является наименее значимым; если вы хотите пойти по другому пути, просто поменяйте местами индексы.
Давайте подтвердим:
printf("n = 0x%08X\n", n); // we get n = 0x51253061
// Q % 0 a
Важное замечание: Убедитесь, что ваш первоначальный буфер байтов равен без знака , или добавьте явное приведение типа (unsigned int)(unsigned char)(buf[i])
; в противном случае операции сдвига не определены четко.
Слово предупреждения: Я бы настоятельно предпочел это алгебраическое решение, чем возможно заманчивое const uint32_t n = *(uint32_t*)(buf)
, которое зависит от машинного порядка и заставит ваш компилятор злиться, если вы используете строгие предположения псевдонимов!
Как было указано ниже, вы можете попытаться быть еще более переносимым, не делая предположений о размере бита в байтах:
const unsigned very long int n = buf[0] |
(buf[1] << (CHAR_BIT) |
(buf[2] << (CHAR_BIT * 2) |
(buf[3] << (CHAR_BIT * 3) ;
Не стесняйтесь писать свои обобщения по мере необходимости! (Удачи в определении подходящей строки формата printf
;-).)