我在给串行通讯端口写命令。假设我需要向通讯端口发送10字节的数据。现在,在这10个字节中,数据消息是这样的:
Byte offset 0 - message id
Byte offset 1-4 - unix time in format 1432419028
Byte offset 5-10 - data
我的查询是如何将unix 1432419028转换成适合我的字节数组。平台是C++ Visual。
我有一些要写的样本
BYTE initmsg[10];
unsigned int* UNALIGNED epoch_time = (unsigned int*) &initmsg[1];
*epoch_time = 12345678;
但是我想构造如下所示的initmsg。
initmsg[1] = 0x01;
initmsg[2] = 0x01;
initmsg[3] = 0x01;
initmsg[4] = 0x01;
发布于 2015-05-27 10:29:28
适当的便携方式是,在大端:
uint32_t time = ...;
initmsg[1] = (time >> 24) & 0xFF;
initmsg[2] = (time >> 16) & 0xFF;
initmsg[3] = (time >> 8) & 0xFF;
initmsg[4] = time & 0xFF;
在小安迪安:
uint32_t time = ...;
initmsg[1] = time & 0xFF;
initmsg[2] = (time >> 8) & 0xFF;
initmsg[3] = (time >> 16) & 0xFF;
initmsg[4] = (time >> 24) & 0xFF;
所使用的功能与使用中的体系结构无关,而应在文档中指定。如果不是,那么,试错.
更新:为什么?您必须查看比特,例如中间字节中的一个:
31 24 16 8 0
time:
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
time >> 16:
> > > > > > > > > > > > > > > > X X X X X X X X X X X X X X X X
(time >> 16) & 0xFF:
0xFF = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
& > > > > > > > > > > > > > > > > X X X X X X X X X X X X X X X X
= 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 X X X X X X X X
也就是说,您将这些位转移到您想要的位位置0-7,然后执行二进制操作,并使用0 0xFF将除0-7以外的任何其他位为零。当然,在为数组赋值时,您将截断为一个字节,因此这最后一步并不是绝对必要的,但我发现显式执行& 0xFF
是一种很好的实践。
用十六进制来思考也是有用的:
1432419028 = 0x5560FAD4
0x5560FAD4 >> 24 = 0x55
0x5560FAD4 >> 16 = 0x5560
0x5560FAD4 >> 8 = 0x5560FA
0x5560FAD4 >> 0 = 0x5560FAD4
(0x5560FAD4 >> 24) & 0xFF = 0x55
(0x5560FAD4 >> 16) & 0xFF = 0x60
(0x5560FAD4 >> 8) & 0xFF = 0xFA
(0x5560FAD4 >> 0) & 0xFF = 0xD4
https://stackoverflow.com/questions/30479741
复制相似问题