c 结构和字节设置/排序

标签 c

您好,我正在尝试将一个字节数组读入一个结构,但字节以相反的顺序输出(与我预期的顺序相反)。有人可以帮我了解发生了什么事吗?

unsigned char buf[] = {
0x11, 0x22, 0x33, 0x44,
0x55, 0x66, 0x77, 0x88,
0x99, 0xaa, 0xbb, 0xcc
};


typedef struct mystruct {
 uint16_t var1;
 uint16_t var2;
 uint32_t var3;
 uint32_t var4;
} something;


int main(int argc,char **argv){

   printf("sizeof buf: %lu %d \n",sizeof(buf),sizeof(something));
   something *st = (something*)&(buf[0]);
   #define pr(a) printf(#a" %x\n",a)
   pr(st->var1);
   pr(st->var2);
   pr(st->var3);
   pr(st->var4);

   return(0);
}

输出:

sizeof buf: 12 12 
st->var1 2211
st->var2 4433
st->var3 88776655
st->var4 ccbbaa99

我期待的是这样的: st->var1 1122

这样做似乎也输出同样的东西?

memcpy(&st->var1,buf,2);
pr(st->var1);

输出: st->var1 2211

x86/Linux 服务器,gcc 版本 4.5.3(如果有帮助的话)

感谢您的帮助。

最佳答案

如果你读到 endianness ,你会看到有两种方法可以在内存中存储超过一个字节的数据。

对于大端系统(如 ARM),整数值 0x1122 在内存中存储为(从低地址到高地址)0x11 0x22。在小端系统(如 x86)上,它存储为 0x22 0x11

由于数组中的数据是以“大端”方式存储的,因此您得到的字节顺序与您在像您这样的小端系统上所期望的相反。

关于c 结构和字节设置/排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17880572/

相关文章:

c - 如何有效地解析c中的字符串

c - int x[size]={0} 的行为

c - 自由的();和 malloc();不断崩溃(C)

c - 这些人物是如何产生的呢?

c - C 中的稀疏数组!如何实现呢?我可以只分配数组的一部分吗?

c - 在从套接字读取响应时,我得到了我之前写的内容

c - 在其 makefile 中引用 C 代码定义的宏

c - C语言中数字是如何在内部表示的

c - 用C编写一个计算PriorityQueue中元素数量的函数

c++ - 这行代码是什么意思*((int*)(0))=1;?