簡體   English   中英

將UINT32值轉換為UINT8數組[4]

[英]Converting a UINT32 value into a UINT8 array[4]

我的問題是,如何以獨立於字節序的方式將UINT32值轉換為UINT8數組[4](C / C ++)? 另外,如何從UINT8數組[4]重建UINT32值,以返回到起點?

您尚未真正說出獨立於字節序的含義-不清楚,因為字節數組必須具有某些字節序。 這就是說,對下面的一個必須回答您的要求:

給定UINT32 vUINT8 a[4]

“主機”字節序

(使用機器的本機字節順序):

UINT8 *vp = (UINT8 *)&v;
a[0] = vp[0];
a[1] = vp[1];
a[2] = vp[2];
a[3] = vp[3];

要么:

memcpy(a, &v, sizeof(v));

要么:

*(UINT32 *)a = v;

大端

(又稱“網絡訂單”):

a[0] = v >> 24;
a[1] = v >> 16;
a[2] = v >>  8;
a[3] = v;

小端

a[0] = v;
a[1] = v >>  8;
a[2] = v >> 16;
a[3] = v >> 24;

例如:

UINT32 value;
UINT8 result[4];

result[0] = (value & 0x000000ff);
result[1] = (value & 0x0000ff00) >> 8;
result[2] = (value & 0x00ff0000) >> 16;
result[3] = (value & 0xff000000) >> 24;

編輯:添加了括號(>>似乎比&的優先級更高)

如果您不想自己編寫代碼,則可以使用C庫函數htonl()將32位int轉換為網絡字節順序。 還有一個函數ntohl()將它們轉換回主機順序。

一旦它們按網絡字節順序排列,只需訪問int / long作為字節數組即可。

總而言之,這可能是實現目標的最可移植且經過測試的方法。

一個人也可以用指針做到這一點。 (這是小端序,但是如果使用相同的重建方法就沒關系了)

uint32 in = 0x12345678;
uint8 out[4];
*(uint32*)&out = in;

這將uint32的值分配給uint8的內存地址之后的4個字節,從而完全滿足您的需要。

換一種方式:

uint8 in[4] = {0x78, 0x56, 0x34, 0x12};
uint32 out;
out = *(uint32*)&in

使用由4個時間uint8和uint32組成的數組組成的Union。

因此它會根據c固有的指針Magic自動排序(數組是指向數組開頭的指針)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM