[英]How to reconstruct a 4 byte uint8 array into a uint32 integer
[英]Converting a UINT32 value into a UINT8 array[4]
我的问题是,如何以独立于字节序的方式将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;
编辑:添加了括号(>>似乎比&的优先级更高)
一个人也可以用指针做到这一点。 (这是小端序,但是如果使用相同的重建方法就没关系了)
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.