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 位浮点的位模式。 ************************************************************************/

相关新闻

STM32F303RC与CMT-8540S-SMT音频开发实战指南

STM32F303RC与CMT-8540S-SMT音频开发实战指南

1. 为什么选择STM32F303RC与CMT-8540S-SMT组合在嵌入式音频开发领域,硬件选型往往决定了项目的上限。STM32F303RC作为STMicroelectronics推出的Cortex-M4内核微控制器,其72MHz主频和硬件FPU单元为实时音频处理提供了坚实基础。而CMT-8540S-SMT这款表面贴…

2026/7/11 7:19:08 阅读更多 →
3分钟解决Windows激活烦恼:KMS智能激活工具全面指南

3分钟解决Windows激活烦恼:KMS智能激活工具全面指南

3分钟解决Windows激活烦恼:KMS智能激活工具全面指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否经常在工作中遇到这样的尴尬场景?正忙着处理重要文档&#xff…

2026/7/11 7:17:07 阅读更多 →
Vant Uploader 多图上传优化:解决 wx.uploadFile 不执行的3个关键点

Vant Uploader 多图上传优化:解决 wx.uploadFile 不执行的3个关键点

Vant Uploader 多图上传深度优化:突破 wx.uploadFile 执行瓶颈的工程实践在微信小程序开发中,图片上传是高频需求场景,而Vant Weapp的Uploader组件因其优雅的UI和便捷的API成为开发者的首选。但当面对多图上传需求时,许多开发者会…

2026/7/11 7:17:07 阅读更多 →

最新新闻

在MiniOB中实现布隆过滤器:C++工程实践与数据库查询优化

在MiniOB中实现布隆过滤器:C++工程实践与数据库查询优化

1. 项目概述:从零到一,理解MiniOB与布隆过滤器的结合如果你正在学习数据库内核或者C,那么“MiniOB”这个名字你应该不陌生。它是一个面向教学和学习的、高度简化的数据库实现,剥离了生产级数据库的复杂特性,保留了最核…

2026/7/11 8:03:37 阅读更多 →
终极指南:使用XUnity.AutoTranslator实现Unity游戏自动翻译

终极指南:使用XUnity.AutoTranslator实现Unity游戏自动翻译

终极指南:使用XUnity.AutoTranslator实现Unity游戏自动翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款强大的Unity游戏翻译插件,专为解决游戏语言…

2026/7/11 8:03:37 阅读更多 →
汉明码 (7,4) 编码实战:Python 实现 1 位纠错与 2 位检错

汉明码 (7,4) 编码实战:Python 实现 1 位纠错与 2 位检错

汉明码 (7,4) 编码实战:Python 实现 1 位纠错与 2 位检错在数字通信系统中,数据传输的可靠性至关重要。汉明码作为一种经典的纠错编码方案,能够有效检测并纠正传输过程中出现的错误。本文将深入探讨(7,4)汉明码的原理,并通过Pytho…

2026/7/11 8:01:37 阅读更多 →
机电一体化学习实战导航:从拧螺丝到系统集成

机电一体化学习实战导航:从拧螺丝到系统集成

1. 这不是“速成指南”,而是一份机电一体化学习者的实战导航图你点开这个标题,大概率正站在人生一个关键岔路口:手握机械、自动化、机器人、新工科类专业的录取通知书,却对“学什么、怎么学、学到什么程度才算入门”毫无头绪&…

2026/7/11 8:01:37 阅读更多 →
真无线耳机实际使用横评:聚焦90%评测忽略的日常失效点

真无线耳机实际使用横评:聚焦90%评测忽略的日常失效点

1. 为什么这篇横评只聊缺点——一个耳机测评老手的真实动机“蓝牙耳机实际使用横评(只说缺点)”,光看标题,你可能觉得这是一篇反向营销稿,或者纯粹为了博眼球的毒舌合集。但作为连续六年深度参与消费电子类配件评测、亲…

2026/7/11 8:01:37 阅读更多 →
AI模型分层策略:弱版模型如何优化成本与性能平衡

AI模型分层策略:弱版模型如何优化成本与性能平衡

上周在帮一个创业团队做技术选型时,他们问了一个很实际的问题:“我们现在用 GPT-4 做原型开发,但用户量上来后成本扛不住。听说最近有更便宜的模型,该不该换?”这个问题背后,其实是整个 AI 服务市场正在发生…

2026/7/11 8:01:37 阅读更多 →

日新闻

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:02:12 阅读更多 →
PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

1. 项目背景与核心需求 在工业控制、安防系统和智能家居等领域,可靠的声音警报系统是不可或缺的基础组件。传统蜂鸣器存在音量不足、音质模糊等问题,而基于压电陶瓷技术的EPT-14A4005P蜂鸣器配合PIC18F45K42微控制器,能够构建一套适应性强、音…

2026/7/11 0:04:12 阅读更多 →
大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm Attention 的 CUDA Kernel 手写与验证 一、GPU 利用率 30%:分开的算子吃掉所有带宽 推理服务的 GPU 利用率监测显示一个反直觉的现象:计算核心(SM)利用率不到 30%,但…

2026/7/11 0:04:12 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻