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