c++ - 将整数转换为 BYTE 值

标签 c++ serial-port

我正在尝试向串行通信端口写入一些命令。假设我需要将 10 个字节的数据发送到 comm 端口。现在,在这 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;

最佳答案

在 Big-Endian 中,正确的可移植方式是:

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;

使用什么字节顺序与使用的架构无关,但应该在文档中指定。如果不是,那么,试错...

更新:这是为什么?您必须查看这些位,例如中间字节之一:

       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

关于c++ - 将整数转换为 BYTE 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30479741/

相关文章:

c++ - 在 C++ 中从文件中尽可能快地读取键值对

c++ - 如何解决中间 block 问题(考虑边缘 block 并在行中间留下任何 block )

c# - 如何通过 rs232 与秤通信

c# - 控制文档中未给出串行命令的电机

java - Windows10 jssc.SerialPortException : openPort(); Exception type - Port busy

c++ - 将错误代码与 C++20 协程一起使用,即与 Boost ASIO 一起使用可等待项

c++ - 堆损坏

java - RXTX java,inputStream不返回所有缓冲区

c++ - 如何从 Eigen::MatrixBase<Derived> 获取存储选项

Windows 服务无法打开 COM 端口