将UINT32值转换为UINT8数组

我的问题是你如何将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组成的联合。

所以它由c固有指针Magic自动排序(数组是指向数组开始的指针)