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

时间:2011-06-27 21:31:54

标签: c++ c endianness

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

5 个答案:

答案 0 :(得分: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];

或:

memcpy(a, &v, sizeof(v));

或:

*(UINT32 *)a = v;

Big endian

(又名“网络订单”):

a[0] = v >> 24;
a[1] = v >> 16;
a[2] = v >>  8;
a[3] = v;

Little endian

a[0] = v;
a[1] = v >>  8;
a[2] = v >> 16;
a[3] = v >> 24;

答案 1 :(得分:12)

E.g。像这样:

UINT32 value;
UINT8 result[4];

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

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

答案 2 :(得分:2)

如果您不想自己编写代码,可以使用C库函数htonl()将32位int转换为网络字节顺序。还有函数ntohl()将它们转换回主机顺序。

一旦它们处于网络字节顺序,只需将int / long作为字节数组进行访问。

总而言之,这可能是实现目标的最便携和最经过验证的方式。

答案 3 :(得分:1)

也可以用指针来做。 (这是小端,但如果你使用相同的重建方法,那就不重要了)

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 :(得分:-3)

使用由具有4次uint8的数组组成的联合 和一个uint32。

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