C++ 工控通用:32 位 DINT 四種字節(jié)序一鍵轉(zhuǎn)換函數(shù)
C 工控通用32 位 DINT 四種字節(jié)序一鍵轉(zhuǎn)換函數(shù)ABCD/CDAB/BADC/DCBA前言做 Modbus TCP/RTU 工控上位機(jī)開發(fā)最頭疼的問題之一就是32 位數(shù)據(jù)字節(jié)序不統(tǒng)一。 PLC 的 DINT32 位有符號(hào)整數(shù)、REAL32 位浮點(diǎn)數(shù)占用 2 個(gè)連續(xù) 16 位寄存器不同廠商設(shè)備字節(jié)排布五花八門西門子標(biāo)準(zhǔn)ABCD大端匯川、臺(tái)達(dá)、大量國(guó)產(chǎn)機(jī)器人CDAB、BADC部分小型控制器DCBA小端Windows 自帶htonl/ntohl僅支持大小端轉(zhuǎn)換無法覆蓋 CDAB、BADC 這兩種雙字交換模式。 為此封裝一個(gè)通用轉(zhuǎn)換函數(shù)一次調(diào)用輸出 4 種主流字節(jié)序調(diào)試、適配多品牌 PLC 非常方便。運(yùn)行環(huán)境Windows MSVC / Qt MSVCx86/x64四種字節(jié)序定義說明假設(shè) 32 位原始整數(shù)0x11223344plaintextbit31~24(A) bit23~16(B) bit15~8(C) bit7~0(D) A0x11 , B0x22 , C0x33 , D0x44表格名稱內(nèi)存字節(jié)序列十六進(jìn)制結(jié)果適用設(shè)備場(chǎng)景ABCDA B C D0x11223344西門子、標(biāo)準(zhǔn)大端CDABC D A B0x33441122大量國(guó)產(chǎn) PLC、機(jī)器人BADCB A D C0x22114433部分運(yùn)動(dòng)控制器、儀表DCBAD C B A0x44332211小端模式完整源碼/** * brief 32位DINT四種字節(jié)序轉(zhuǎn)換函數(shù) * param input 原始32位有符號(hào)整數(shù)(PLC DINT) * param ABCD 輸出 A B C D 原始序 * param CDAB 輸出 C D A B * param BADC 輸出 B A D C * param DCBA 輸出 D C B A * note 僅Windows MSVC環(huán)境使用適配Modbus上位機(jī)通信 */ void ABCD_SWAP(int input, int* ABCD, int* CDAB, int* BADC, int* DCBA) { // 空指針保護(hù)防止外部異常調(diào)用導(dǎo)致程序崩潰 if (!ABCD || !CDAB || !BADC || !DCBA) return; unsigned char A, B, C, D; unsigned int uIn (unsigned int)input; *ABCD input; // 拆分4個(gè)字節(jié) D uIn 0xFF; C (uIn 8) 0xFF; B (uIn 16) 0xFF; A (uIn 24) 0xFF; // 重組四種字節(jié)順序 *CDAB (unsigned int)C 24 | (unsigned int)D 16 | (unsigned int)A 8 | B; *BADC (unsigned int)B 24 | (unsigned int)A 16 | (unsigned int)D 8 | C; *DCBA (unsigned int)D 24 | (unsigned int)C 16 | (unsigned int)B 8 | A; }調(diào)用示例 單元測(cè)試#include iostream using namespace std; int main() { int ABCD, CDAB, BADC, DCBA; // 測(cè)試樣例 0x11223344 ABCD_SWAP(0x11223344, ABCD, CDAB, BADC, DCBA); printf(ABCD 0x%08X\n, (unsigned int)ABCD); printf(CDAB 0x%08X\n, (unsigned int)CDAB); printf(BADC 0x%08X\n, (unsigned int)BADC); printf(DCBA 0x%08X\n, (unsigned int)DCBA); return 0; }輸出結(jié)果ABCD 0x11223344 CDAB 0x33441122 BADC 0x22114433 DCBA 0x44332211關(guān)鍵技術(shù)要點(diǎn)說明1. 為什么先轉(zhuǎn) unsigned int 拆分原始參數(shù)int是有符號(hào)類型。 如果數(shù)值為負(fù)數(shù)直接input 24會(huì)觸發(fā)算術(shù)右移高位補(bǔ) 1字節(jié)拆分出錯(cuò)。 先強(qiáng)制轉(zhuǎn)為unsigned int保證邏輯右移高低字節(jié)拆分永遠(yuǎn)穩(wěn)定。2. 移位操作強(qiáng)制轉(zhuǎn)換 unsigned intunsigned char直接左移 24 位會(huì)提升為有符號(hào) int存在符號(hào)溢出隱患。(unsigned int)C 24保證移位全程無符號(hào)運(yùn)算規(guī)避未定義行為。3. 空指針判斷工控軟件必備上位機(jī)軟件外部調(diào)用邏輯復(fù)雜如果外部傳入 nullptr不做判斷會(huì)直接觸發(fā)訪問異常、程序閃退。工業(yè)代碼穩(wěn)定性優(yōu)先。4. 拓展同時(shí)支持 32 位浮點(diǎn)數(shù) REALPLC 32 位浮點(diǎn) REAL 同樣 4 字節(jié)這套轉(zhuǎn)換邏輯完全通用。使用方式float realVal 123.456f; int raw *(int*)(realVal); int a,b,c,d; ABCD_SWAP(raw, a, b, c, d);

相關(guān)新聞

一鍵永久保存你的QQ空間記憶:GetQzonehistory完整備份指南

一鍵永久保存你的QQ空間記憶:GetQzonehistory完整備份指南

一鍵永久保存你的QQ空間記憶:GetQzonehistory完整備份指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否還記得那些年在QQ空間留下的青春足跡?那些深夜的…

2026/7/29 18:08:11 閱讀更多
金蝶鉑金授權(quán)認(rèn)證服務(wù)伙伴標(biāo)準(zhǔn)是怎樣的?全面解析認(rèn)證制度

金蝶鉑金授權(quán)認(rèn)證服務(wù)伙伴標(biāo)準(zhǔn)是怎樣的?全面解析認(rèn)證制度

金蝶鉑金授權(quán)認(rèn)證服務(wù)伙伴標(biāo)準(zhǔn)是金蝶生態(tài)體系中最高級(jí)別的合作伙伴準(zhǔn)入與評(píng)估制度,它系統(tǒng)性地定義了頂級(jí)服務(wù)商應(yīng)具備的能力基線、服務(wù)品質(zhì)和組織成熟度。金眾誠(chéng)科技等標(biāo)桿的金蝶鉑金級(jí)營(yíng)銷與交付合作伙伴,長(zhǎng)期踐行這一標(biāo)準(zhǔn)體系。本文將從認(rèn)證標(biāo)準(zhǔn)的制度…

2026/7/29 18:48:13 閱讀更多
2026 年,國(guó)內(nèi)網(wǎng)管平臺(tái)如何替換 SolarWinds?

2026 年,國(guó)內(nèi)網(wǎng)管平臺(tái)如何替換 SolarWinds?

引言2026 年是國(guó)內(nèi)政企信創(chuàng)規(guī)模化落地的關(guān)鍵窗口期。依據(jù)國(guó)企、金融、政務(wù)行業(yè)國(guó)產(chǎn)化時(shí)間表,基礎(chǔ)設(shè)施運(yùn)維監(jiān)控系統(tǒng)正式進(jìn)入集中替換周期。長(zhǎng)期以來,SolarWinds Orion 憑借完善的網(wǎng)絡(luò)監(jiān)控能力,廣泛應(yīng)用于國(guó)內(nèi)大型企業(yè)數(shù)據(jù)中心、廣域網(wǎng)運(yùn)維場(chǎng)景…

2026/7/29 18:48:13 閱讀更多
Multicorn高級(jí)技巧:自定義Python外部數(shù)據(jù)包裝器開發(fā)實(shí)戰(zhàn)

Multicorn高級(jí)技巧:自定義Python外部數(shù)據(jù)包裝器開發(fā)實(shí)戰(zhàn)

Multicorn高級(jí)技巧:自定義Python外部數(shù)據(jù)包裝器開發(fā)實(shí)戰(zhàn) 【免費(fèi)下載鏈接】Multicorn Data Access Library 項(xiàng)目地址: https://gitcode.com/gh_mirrors/mu/Multicorn Multicorn是PostgreSQL的一個(gè)強(qiáng)大擴(kuò)展,它允許開發(fā)者使用Python編寫外部數(shù)據(jù)包裝…

2026/7/29 18:48:13 閱讀更多
從理論到實(shí)踐:Geotorch約束優(yōu)化的數(shù)學(xué)原理與代碼實(shí)現(xiàn)

從理論到實(shí)踐:Geotorch約束優(yōu)化的數(shù)學(xué)原理與代碼實(shí)現(xiàn)

從理論到實(shí)踐:Geotorch約束優(yōu)化的數(shù)學(xué)原理與代碼實(shí)現(xiàn) 【免費(fèi)下載鏈接】geotorch Constrained optimization toolkit for PyTorch 項(xiàng)目地址: https://gitcode.com/gh_mirrors/ge/geotorch Geotorch是一個(gè)專為PyTorch設(shè)計(jì)的約束優(yōu)化工具包,它提供了…

2026/7/29 18:38:12 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個(gè)問題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂應(yīng)用,模擬了真實(shí)擲骰子的過程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫效果?!?/p>

2026/7/29 0:15:24 閱讀更多