- 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));
}
ctm 27.06.2011 07:42 # 0
тогда бы просто return *((int*)p); было бы достаточно
absolut 27.06.2011 07:45 # 0
SadKo 27.06.2011 09:11 # 0
ctm 27.06.2011 09:30 # 0
Dummy00001 27.06.2011 22:37 # +2
нечего даже описывать - почти в любой реализации сетевого протокола такое найдешь.
и `(*(int *)p)` естественно не портабельно потому что на архитектурах с строгим выравниванием (POWER, SPARC) будет слетать с SIGBUS если `p` на 4-ре байта не выровнено.
rat4 28.06.2011 11:41 # 0
guest 28.06.2011 11:45 # +1
bugmenot 28.06.2011 11:49 # 0
guest 28.06.2011 12:03 # +1
guest 28.06.2011 12:04 # 0
#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);
}
Dummy00001 28.06.2011 12:43 # 0
но это не С. в С функции должны иметь разные имена.
напомнило мне что у нас к слову эти функции слегка по другому определены и возвращают знаковое, что в общем случае нам полезней:
в другой части проекта нужно беззнаковое и я смотрю мои коллеги долго не раздумывали как это сделать:
guest 28.06.2011 13:06 # −1
Комемяу?
guest 28.06.2011 13:10 # 0
TarasB 27.06.2011 12:02 # 0
Aleskey 27.06.2011 10:57 # +3
bugmenot 27.06.2011 11:39 # 0
guest 27.06.2011 13:23 # −1
bugmenot 28.06.2011 11:51 # 0
guest8 08.04.2019 21:01 # −999
guest8 09.04.2019 11:04 # −999
guest8 09.04.2019 18:09 # −999