首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
数据库
›
SQL-Server
›
为什么拆分高低字节而不直接存入数组
返回列表
发新帖
为什么拆分高低字节而不直接存入数组
[复制链接]
发表于 2025-9-16 20:43:34
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
您的
代码
片断是在将一个16位值()拆分为高字节和低字节:IR_RF_Signal.length
temp_low = IR_RF_Signal.length & 0xFF;
temp_high = IR_RF_Signal.length >> 8;
复制
代码
固然我在 PX4-Autopilot 仓库中没有找到这段确切的
代码
,但这是嵌入式体系中的常见做法,特殊是在处置处罚通讯协议时。这么做的原因主要有以下几点:
1. 通讯协议的数据包格式
在大多数低级通讯协议中(如UART、SPI、I2C等),数据是按字节一个一个传输的。当需要传输一个多字节的值(如16位的长度值)时,必须将其拆分成单个字节举行传输。拆分成高低字节是标准做法。
2. 字节序(Endianness)思量
差别的体系大概利用差别的字节序(大端序或小端序)。通过明白地将值拆分为高字节和低字节,可以确保通讯两边以雷同的方式表明数据,制止字节序差别导致的问题。
3. 内存服从
在资源受限的嵌入式体系中,明白控制每个字节如何
存储
和传输可以进步内存和带宽服从。
4. 协议兼容性
许多通讯协议有特定的数据包格式要求,必须按照固定的格式构造数据包。拆分高低字节是遵照这些格式要求的一种方式。
为什么不直接用数组?
您问为什么不能直接将值存入数组。技术上来说,可以如许做:
uint8_t length_bytes[2];
length_bytes[0] = IR_RF_Signal.length & 0xFF; // 低字节
length_bytes[1] = IR_RF_Signal.length >> 8; // 高字节
复制代码
大概利用连合体(union)或布局体指针转换。但是,明白地拆分为独立变量有几个上风:
代码可读性更高,明白体现这是长度值的高字节和低字节
制止大概的内存对齐问题
在某些环境下大概需要单独处置处罚这些字节,如添加到差别的数据包位置
留意事项
这种拆分方式实际上是在实现小端序(little-endian)的字节序,即低字节在前,高字节在后。假如吸取方盼望大端序(big-endian),则应该调解
存储
次序。
为什么需要将IR_RF_Signal.length拆分成高低字节
在嵌入式体系中,经常需要将多字节数据拆分成单字节举行
存储
或传输,这段代码就是如许的一个例子。
原因是是一个16位的无符号整数(),而是一个8位字节()的数组:IR_RF_Signal.length uint16_tW25Q64_Bufferuint8_t
<strong>volatile</strong> <strong>uint8_t</strong> W25Q64_Buffer[4096] = {0};
复制代码
在函数中,需要将16位的值存储到这个8位的缓冲区中:Module_IR_RF_Copy_To_Bufferlength
temp_low = IR_RF_Signal.length & 0xFF; temp_high = IR_RF_Signal.length >> 8; W25Q64_Buffer[0] = temp_low; W25Q64_Buffer[1] = temp_high;
复制代码
如许做的原因是:
W25Q64闪存芯片的接口是基于字节操纵的,每次只能读写8位数据
必须将16位的值分解成两个8位字节才气存储length
利用获取低8位,利用获取高8位& 0xFF>> 8
同样地,步调也对数组中的每个16位值举行了类似的拆分:duration
for (i = 0; i < IR_RF_Signal.length; i++) {
temp_low = IR_RF_Signal.duration[i] & 0xFF;
temp_high = IR_RF_Signal.duration[i] >> 8;
W25Q64_Buffer[i * 2 + 2] = temp_low;
W25Q64_Buffer[i * 2 + 3] = temp_high;
}
复制代码
反过来,当从闪存读取数据时,也需要将两个字节重新组合成一个16位值:
temp_low = W25Q64_Buffer[0];
temp_high = W25Q64_Buffer[1];
IR_RF_Signal.length = (temp_high << 8) | temp_low;
复制代码
这种拆分和重组16位值的方法在嵌入式体系和通讯协议中非常常见,特殊是在处置处罚跨字节界限的多字节数据时。
留意
假如想直接存储在数组中而不拆分,那么需要利用uint16_t范例的缓冲区,但W25Q64闪存的接口是基于字节(8位)作的,以是终极在与硬件交互时仍旧需要举行字节拆分。
回复
使用道具
举报
返回列表
浏览过的版块
主机安全
千千梦丶琪
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表