如何将4字节“字符串”转换为uint32_t?

时间:2012-02-19 02:48:34

标签: c binary-data glib

基本上,我有一个数据字节串,如:\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

所以,这有时 ,但并非总是如此。老实说,我不知道我做错了什么!

谢谢!


P.S:代码有点冗长和奇怪,我不认为通过这一切都是相关的。除非有人要求,否则我不会不必要地混淆这个问题

3 个答案:

答案 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;
}

注意:我没有尝试过代码,可能会有错误,但是你明白了