繁体   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