我對如何在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