Оставляя бремя сопоставления порядка байтов с вашей другой функцией, вот один из способов:
unsigned long int l = pdest[0] | (pdest[1] << 8) | (pdest[2] << 16) | (pdest[3] << 24);
На всякий случай, вот соответствующее другое направление:
unsigned char pdest[4];
unsigned long int l;
pdest[0] = l & 0xFF;
pdest[1] = (l >> 8) & 0xFF;
pdest[2] = (l >> 16) & 0xFF;
pdest[3] = (l >> 24) & 0xFF;
Переход от char[4]
к длинному и обратно полностью обратим;переход от long к char[4]
и обратно обратим для значений до 2 ^ 32-1.
Обратите внимание, что все это четко определено только для неподписанных типов.
(Мой пример little endian, если вы читаете pdest
слева направо.)
Добавление: Я также предполагаю, что CHAR_BIT == 8
.Как правило, в коде следует заменить кратные 8 на кратные CHAR_BIT
.