首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将整数转换为字节值

将整数转换为字节值
EN

Stack Overflow用户
提问于 2015-05-27 10:24:45
回答 1查看 2.6K关注 0票数 0

我在给串行通讯端口写命令。假设我需要向通讯端口发送10字节的数据。现在,在这10个字节中,数据消息是这样的:

代码语言:javascript
运行
复制
Byte offset 0    - message id
Byte offset 1-4  - unix time in format 1432419028
Byte offset 5-10 - data

我的查询是如何将unix 1432419028转换成适合我的字节数组。平台是C++ Visual。

我有一些要写的样本

代码语言:javascript
运行
复制
  BYTE initmsg[10];
  unsigned int* UNALIGNED epoch_time = (unsigned int*) &initmsg[1];
  *epoch_time = 12345678;

但是我想构造如下所示的initmsg。

代码语言:javascript
运行
复制
  initmsg[1] = 0x01;
  initmsg[2] = 0x01;
  initmsg[3] = 0x01;
  initmsg[4] = 0x01;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-27 10:29:28

适当的便携方式是,在大端:

代码语言:javascript
运行
复制
uint32_t time = ...;
initmsg[1] = (time >> 24) & 0xFF;
initmsg[2] = (time >> 16) & 0xFF;
initmsg[3] = (time >> 8) & 0xFF;
initmsg[4] = time & 0xFF;

在小安迪安:

代码语言:javascript
运行
复制
uint32_t time = ...;
initmsg[1] = time & 0xFF;
initmsg[2] = (time >> 8) & 0xFF;
initmsg[3] = (time >> 16) & 0xFF;
initmsg[4] = (time >> 24) & 0xFF;

所使用的功能与使用中的体系结构无关,而应在文档中指定。如果不是,那么,试错.

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

代码语言:javascript
运行
复制
       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是一种很好的实践。

用十六进制来思考也是有用的:

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30479741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档