将整数转换为BYTE值
Convert an integer to BYTE value
我正试图写一些命令到串行通信端口。假设我需要发送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
相关文章:
- C++如何将字符数组转换为字节向量(向量<byte>)
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- C++ 无法将 std::vector<BYTE> 转换为字符串或字符数组
- 三维数组中的C/C++DWORD到BYTE和BYTE到DWORD的转换
- 在 C++ 中转换 std::string,使其可以是 C# 中的 byte[]
- 将 BYTE 数组转换为无符号长整型
- 将 BYTE* 从MODULEENTRY32的 modBaseAddr 转换为 std::string
- 如何在不产生 JNI 问题的情况下转换 byte[] -> uint8_t[]?
- C++ 如何将 BYTE* 转换为 _CERT_TEMPLATE_EXT* 并在进一步使用前检查结果
- 将 BSTR 转换为 BYTE 数组C++
- 如何将 ArrayList<byte[]> 转换为 JNI 的 vector<char[]>?
- 字符串迭代器不兼容错误,当我将字符串转换为矢量<byte>时
- Visual C++ 2010 - 转换 10 GB BYTE 数组的最快方法?
- 如何将 BYTE 数组转换为字符数组以使用套接字 C++ 发送
- 在 VSS 硬件框架 c++ 中将 BYTE 转换为 BSTR
- 正在将托管Byte数组转换为非托管字符串
- 需要将cstring转换为byte*,并需要在c++函数中将其作为i/p参数传递
- 无法从'byte[]'转换为'byte*'
- 将BYTE*转换为wstring
- 将const Byte*转换为std::string