将UINT32值转换为UINT8数组
我的问题是你如何将UINT32值转换为UINT8数组[4](C / C ++),最好是以独立于字节序的方式? 另外,如何从UINT8数组[4]重建UINT32值,以回到你开始的位置?
你没有真正说出你的意思是独立于字节序 – 由于字节数组必须有一些字节序 ,所以不清楚。 也就是说,以下之一必须满足您的要求:
鉴于UINT32 v
和UINT8 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自动排序(数组是指向数组开始的指针)