我对如何在struct
中排序字节有点困惑。结构中的字节顺序
比方说,我有以下结构:
struct container {
int myint;
short myshort;
long mylong;
};
现在,我要初始化struct container
类型的变量,就像下面,除了做到使用数组它,我要。
struct container container1 = {.myint = 0x12345678,
.myshort = 0xABCD,
.mylong = 0x12345678};
假设sizeof
int
和long
是4
,那的short
是2
。
假设没有填充。
那么struct
的10 bytes
的布局如何呢?
它取决于字节顺序吗?
将它像:
0x12345678 ABCD 12345678
或类似:
0x78563412 CDAB 78563412
我想要做的是:我有以下的字符数组:
char buffer[10] = {0};
我想手动用数据填充该阵列,然后memcpy
到struct
。
我应该做[1]:
buffer[0] = 0x12345678 & 0xFF;
buffer[1] = 0x12345678 >> 8 & 0xFF;
buffer[2] = 0x12345678 >> 16 & 0xFF;
buffer[3] = 0x12345678 >> 24 & 0xFF;
...
buffer[9] = 0x12345678 >> 24 & 0xFF;
还是应[2]:
buffer[0] = 0x12345678 >> 24 & 0xFF;
buffer[1] = 0x12345678 >> 16 & 0xFF;
buffer[2] = 0x12345678 >> 8 & 0xFF;
buffer[3] = 0x12345678 & 0xFF;
...
buffer[9] = 0x12345678 & 0xFF;
我做之前,我memcpy
像:
memcpy(&container1, buffer, sizeof(container1);
而且,如果我是wr到一个数组并复制到struct
,它是否跨系统可移植,特别是关于字节序?
编辑: 在大端确实有点endian机器和[2]上[1]工作?
不,这是不可移植。是的,这取决于排序。而有关填充和类型大小的假设也会导致可移植性问题。 – user3386109
为了强调*不可移植的方式*,这意味着在同一个操作系统上从编译器到编译器都不是可移植的方式,从操作系统到操作系统的便携性更小。 –
当然这取决于字节顺序!在“没有填充”假设之后,问题不再与结构类型有关。它只是关于在内存中表示整数。 – AnT