将UINT32值转换为UINT8数组[4]

Chr*_*ris 13 c c++ endianness

我的问题是如何将UINT32值转换为UINT8数组[4](C/C++),最好是以独立于字节序的方式?另外,如何从UINT8数组[4]重建UINT32值,以回到你开始的位置?

Aln*_*tak 19

你没有真正说出你的意思是独立于字节序 - 由于字节数组必须有一些字节,所以不清楚.这就是说,一个的下方必须回答您的要求:

给定UINT32 vUINT8 a[4]:

"主持人"端

(使用机器的本机字节顺序):

UINT8 *vp = (UINT8 *)&v;
a[0] = vp[0];
a[1] = vp[1];
a[2] = vp[2];
a[3] = vp[3];
Run Code Online (Sandbox Code Playgroud)

要么:

memcpy(a, &v, sizeof(v));
Run Code Online (Sandbox Code Playgroud)

要么:

*(UINT32 *)a = v;
Run Code Online (Sandbox Code Playgroud)

大端

(又名"网络秩序"):

a[0] = v >> 24;
a[1] = v >> 16;
a[2] = v >>  8;
a[3] = v;
Run Code Online (Sandbox Code Playgroud)

小端

a[0] = v;
a[1] = v >>  8;
a[2] = v >> 16;
a[3] = v >> 24;
Run Code Online (Sandbox Code Playgroud)


Pat*_*ick 12

像这样:

UINT32 value;
UINT8 result[4];

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

编辑:添加括号(>>似乎优先于&)

  • 无论"&"运算符的美学价值如何,事实上它们都会破坏代码.`>>`的优先级高于`&`. (4认同)
  • 关于&的使用:您不仅要为编译器编写代码.您也可以为您之后的代码编写代码.在我看来,添加&明确表示你采用这个特定字节,并且你不依赖于任何背后截断.我仍然认为编译器比读代码更聪明.所以不要让代码对编译器可读; 使读者可读. (3认同)
  • @R .:我不同意。它们表达对称性(为此我通常有一个“ >> 0”),并且它必须是一个相当糟糕的编译器,不会对其进行优化。 (2认同)
  • 你应该注意到这是小端. (2认同)