- 1
- 2
- 3
uint32_t getuint32(char *p){
return (*p<<24)|(*(p+1)<<16)|(*(p+2)<<8)|(*(p+3));
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+147
uint32_t getuint32(char *p){
return (*p<<24)|(*(p+1)<<16)|(*(p+2)<<8)|(*(p+3));
}
тогда бы просто return *((int*)p); было бы достаточно
нечего даже описывать - почти в любой реализации сетевого протокола такое найдешь.
и `(*(int *)p)` естественно не портабельно потому что на архитектурах с строгим выравниванием (POWER, SPARC) будет слетать с SIGBUS если `p` на 4-ре байта не выровнено.
#include <stdint.h>
#include <stdio.h>
uint32_t getuint32(signed char *p){
return (*p<<24)|(*(p+1)<<16)|(*(p+2)<<8)|(*(p+3 ));
}
uint32_t getuint32(unsigned char *p){
return (*p<<24)|(*(p+1)<<16)|(*(p+2)<<8)|(*(p+3 ));
}
int main ()
{
uint32_t a, b;
char s [] = "\x55\x11\xAA\x33";
a = getuint32 ((signed char *) s);
b = getuint32 ((unsigned char *) s);
printf ("a = %u; b= %u\n", a, b);
}
но это не С. в С функции должны иметь разные имена.
напомнило мне что у нас к слову эти функции слегка по другому определены и возвращают знаковое, что в общем случае нам полезней:
в другой части проекта нужно беззнаковое и я смотрю мои коллеги долго не раздумывали как это сделать:
Комемяу?