基本上,我有一个数据字节串,如:\x00\x00\x00\x00 \x08\x00\x00\x00 \x05\x00\x00\x00
(空格仅用于可见性,实际字节串中没有空格字节)。数据是小端的。
现在,我需要提取第二个4字节组(\x08\x00\x00\x00
,即128
)并将其转换为无符号长整数。所以,uint32_t
类型。
基本上,我正在做的是:moveBlock(&gdata->str[4], &second_group, 4);
moveBlock
是一个宏:#define moveBlock(src,dest,size) memmove(dest,src,size)
。
我使用宏因为我个人更喜欢参数的顺序,如果有人想知道。
gdata->str
是指向gchar *
(ref. here)的指针
和gdata是GString *
(ref. here)。
second_group
被定义为uint32_t
。
所以,这有时 ,但并非总是如此。老实说,我不知道我做错了什么!
谢谢!
答案 0 :(得分:5)
这是干净的便携版:
unsigned char *p = (void *)data_source;
uint32_t x = p[0] + 256U*p[1] + 65536U*p[2] + 16777216U*p[3];
答案 1 :(得分:1)
您可以尝试strtoul()
编辑:您必须将null终止数组以使其成为字符串。
答案 2 :(得分:0)
“string”实际上是大端。
然后你需要be32toh
或者像这样自己写一下:
uint32_t conver(const void *src){
const char *s = src;
const char out[] = { s[3],s[2],s[1], s[0] };
return (uint32_t) out;
}
注意:我没有尝试过代码,可能会有错误,但是你明白了