C++/Qt 工业协议中的数据类型的选择原则和典型用法。

发布时间:2026/10/17 8:43:25

C++/Qt 工业协议中的数据类型的选择原则和典型用法。 一、类型对比总结类型符号大小本质在工业协议中的角色char由实现定义通常有符号1 字节C 内建字符类型不推荐用于字节操作范围 –128 ~ 127存 ≥128 的值会溢出/符号扩展unsigned char无符号1 字节C 内建无符号字节类型单字节的首选类型0~255 无歧义uint8_t无符号1 字节C11 标准 8 位整型与unsigned char等价可跨非 Qt 项目quint8无符号1 字节Qt 的typedef unsigned char quint8Qt 项目中等同于unsigned char风格统一unsigned short无符号≥2 字节通常 2 字节C 内建无符号字节类型可与uint16_t混用但大小不完全保证严格 16 位uint16_t无符号2 字节C11 标准 16 位整型存放 16 位寄存器值Modbus、Profibus 等quint16无符号2 字节Qt 的unsigned short(保证 16 位)同上Qt 专用QByteArray内部char但逻辑无符号动态Qt 字节数组容器整个报文的承载者拼接、存储、传输二、核心区别与选用原则1. 字节类型1 字节永远不要用char来存储原始字节因为它的符号性是平台相关的。0x80可能变成-128在比较和位运算中产生错误。首选unsigned char或uint8_t或quint8三者本质相同unsigned char byte1 0x80; // C 风格 uint8_t byte2 0x80; // 标准 C 风格 quint8 byte3 0x80; // Qt 风格在纯 Qt 项目中用quint8风格一致需要跨非 Qt 环境时用uint8_t2. 双字节类型16 位unsigned short是 C 内建类型标准只规定“至少 16 位”但现代平台都是 16 位。Qt 的quint16就是unsigned short并明确保证为 16 位。uint16_t是 C11 标准类型严格 16 位无符号。在跨平台或非 Qt 代码中更安全。工业协议中两者可互换但建议统一风格Qt 项目用quint16通用代码用uint16_t。注意不要混用unsigned short和uint16_t去接收同一个变量因为理论上unsigned short可能大于16位极少见不过实践中没问题。3. 字节容器QByteArray是字节流的理想容器提供自动内存管理、拼接、索引、与 C 接口互操作的能力。内部存储使用char*但 Qt 承诺将其内容视为无符号字节并提供constData()、data()等函数。读取单字节时强转成quint8或unsigned char以避免符号扩展quint8 val static_castquint8(buffer.at(0));三、工业协议中的黄金组合下面是用这些类型构建一个“写浮点数”的典型流程西门子 S7、Modbus 等场景// 1. 原始数值 float realVal ui-write_real_value-text().toFloat(); // 2. 位模式复制到32位无符号整数平台字节序无关只复制二进制 quint32 raw; std::memcpy(raw, realVal, sizeof raw); // 3. 手动将 raw 转为 4 字节大端放入 payload QByteArray payload; payload.resize(4); // 高字节在前大端 payload[0] static_castchar((raw 24) 0xFF); payload[1] static_castchar((raw 16) 0xFF); payload[2] static_castchar((raw 8) 0xFF); payload[3] static_castchar( raw 0xFF); // 4. 构造完整报文 QByteArray telegram; // 功能码单字节0x01 安全不会出现符号问题 telegram.append(static_castchar(0x01)); // 起始地址 264 (0x0108) 手动拆成大端两字节 quint16 startAddr 264; telegram.append(static_castchar((startAddr 8) 0xFF)); // 高字节 0x01 telegram.append(static_castchar( startAddr 0xFF)); // 低字节 0x08 // 追加浮点数据已经是4字节大端 telegram.append(payload); // 后续计算校验、发送...解析响应时同理// 假设 response 是从 PLC 收到的 QByteArrayoffset 是浮点数据起始偏移 const unsigned char *ptr reinterpret_castconst unsigned char*(response.constData()) offset; // 1. 手动将两个 16 位寄存器从大端转为主机字节序 quint16 regHi (static_castquint16(ptr[0]) 8) | ptr[1]; // 高16位 quint16 regLo (static_castquint16(ptr[2]) 8) | ptr[3]; // 低16位 // 2. 组合成 32 位注意 regHi 在高位 quint32 combined (static_castquint32(regHi) 16) | regLo; // 3. 位模式复制回 float float result; std::memcpy(result, combined, sizeof result); /************************************************************************ quint16 regHi (static_castquint16(ptr[0]) 8) | ptr[1]; // 高16位 quint16 regLo (static_castquint16(ptr[2]) 8) | ptr[3]; // 低16位 1. 为什么不是“转换成 8 位” 工业协议中一个 16 位寄存器本身就是 16 位的数据本来就应该用 16 位类型承载。 从字节流解析的过程就是从两个 8 位“原料”组装成一个 16 位“成品”而不是把 16 位“压缩”成 8 位。 2. 整个思路 text 字节流: [ptr[0]] [ptr[1]] ← 两个 8 位 └─高8位─┘ └─低8位─┘ ↓ 拼接 regHi (16位) ptr[0] 贡献高 8 位ptr[1] 贡献低 8 位组合起来就是原本传输的 16 位寄存器值。这个值自然要存在 quint16 变量里后续才能继续左移 16 位组合成 32 位浮点的位模式。 ************************************************************************/
延伸阅读

更多相关文章

2026/10/16 20:39:10

哔哩下载姬DownKyi:从技术原理到合规使用的完整解析

哔哩下载姬DownKyi:从技术原理到合规使用的完整解析 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#xf…

2026/10/16 23:00:15

Claude Code与Codex本质区别:AI编程范式选择指南

1. 项目概述:这不是两个工具的简单“拉郎配”,而是AI编程范式的分水岭 你搜“Claude Code和Codex多维度对比”,页面上全是零散的安装报错、中文设置失败、命令行识别不了的截图,还有人发帖问“为什么我敲 claude 没反应”——这…

2026/10/17 5:41:14

从“能耗”到“能碳”:AcrelEMS 3.0如何重塑制药企业绿色智造新范式

在全球医药行业加速向绿色低碳转型的浪潮中,制药企业正面临着前所未有的挑战与机遇。作为典型的高耗能、高合规要求行业,现代制药工厂不仅需要保障极高的生产连续性与用电安全,还需应对日益严苛的碳排放核算与ESG(环境、社会和公司…

2026/10/17 8:40:06

共享浏览器与Session克隆:跨节点状态同步的工程实践

简介:这份资源围绕“克隆Session、共享浏览器”这一技术主题,面向具备一定Web开发与网络基础、希望研究跨设备会话迁移的开发者。它要解决的核心问题是:如何捕获并解析HTTP请求中的Session ID与Cookie,将其安全传输到异地设备&…

2026/10/17 8:40:06

智能体通信协议基础:消息分层、语义一致性与多轮对话实战

我已经把第十章内容整理成一篇面向从业者的博文。直接从正文开始,不加任何前置说明。开头做过多智能体系统的人一定经历过这种尴尬:智能体A用一套自定义协议兴冲冲给智能体B发了条消息,B按自己的“理解”回了串状态码,两边都觉得自…

2026/10/17 8:40:06

非final字段加锁隐患:对象身份与synchronized并发安全

1. 从一次编译警告说起的排查过程大概一年前,我在重构一个并发模块的时候,代码里出现了一个很不起眼的警告:WARNING: Synchronization on a non-final field编译能过,测试也能跑,但IDEA直接在synchronized(lock)那一行…

2026/10/17 8:40:06

.NET MAUI实战迁移与跨平台部署避坑指南

简介:这是一本面向.NET开发者进阶跨平台应用开发的实战指南,聚焦.NET MAUI框架的核心原理与工程落地,特别适合已有C#和XAML基础、希望掌握MVVM架构、多平台适配及CI/CD部署全流程的中高级开发者。全书系统覆盖基础控件使用、双向数据绑定机制…

2026/10/17 8:40:06

Ubuntu 22.04离线部署TigerVNC无头远程桌面实战

项目一拿到手,我脑子里浮现的第一句话就是:又得跑机房一趟了。Ubuntu 22.04 服务器装离线远程桌面,这活儿看起来简单,实际坑比想象的多。关键词是“离线”、“TigerVNC”、“无头”。很多生产环境没有显示器、没有公网出口&#x…

2026/10/17 8:35:06

DVWA靶场实战:反射型XSS从原理到过滤绕过与防御详解

1. 从一次“偶发弹窗”说起:反射型XSS到底是怎么回事DVWA(Damn Vulnerable Web Application)是圈内几乎人人上手过的Web安全靶场模拟项目,专门为安全教学和漏洞训练设计。这次要拆解的是其中的反射型XSS(Reflected XSS…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/17 0:04:32

PlanarSLAM:面向曼哈顿世界的点线面联合SLAM系统

简介:本资源是面向机器人视觉与SLAM研究者的C开源RGB-D SLAM系统实现,专为结构化室内场景(如办公室、走廊)设计,通过融合点、线、平面三类几何特征并引入“曼哈顿世界”假设,显著提升位姿跟踪鲁棒性与稠密地…

2026/10/17 0:04:32

TDH Workflow调度实战:从DAG依赖驱动到任务编排与故障排查

1. 从一个调度脚本说起:TDH Workflow到底在解决什么问题第一次接触TDH的Workflow,是在一个数据清洗项目里。当时团队每天要跑几十个ETL任务,任务之间有严格的先后依赖——A表清洗完才能跑B表的关联,B表跑完才能触发C表的聚合。最开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑