将整数转换为BYTE值

Convert an integer to BYTE value

本文关键字:BYTE 转换 整数      更新时间:2023-10-16

我正试图写一些命令到串行通信端口。假设我需要发送10字节的数据到通信端口。在这10个字节中,数据消息是这样的:

Byte offset 0    - message id
Byte offset 1-4  - unix time in format 1432419028
Byte offset 5-10 - data

我的查询是如何将unix时间1432419028转换为适合我的BYTE数组。平台为c++ Visual Studio。

我有一些例子来写,比如

  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;

正确的移植方式是:

uint32_t time = ...;
initmsg[1] = (time >> 24) & 0xFF;
initmsg[2] = (time >> 16) & 0xFF;
initmsg[3] = (time >> 8) & 0xFF;
initmsg[4] = time & 0xFF;

在Little-Endian中:

uint32_t time = ...;
initmsg[1] = time & 0xFF;
initmsg[2] = (time >> 8) & 0xFF;
initmsg[3] = (time >> 16) & 0xFF;
initmsg[4] = (time >> 24) & 0xFF;

使用的端序与所使用的体系结构无关,但应在文档中指定。如果不是,那就试一试……

UPDATE:为什么?您必须查看比特,例如中间的一个字节:

       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位,然后用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