C++ 工控通用:32 位 DINT 四種字節(jié)序一鍵轉(zhuǎn)換函數(shù)
C 工控通用32 位 DINT 四種字節(jié)序一鍵轉(zhuǎn)換函數(shù)ABCD/CDAB/BADC/DCBA前言做 Modbus TCP/RTU 工控上位機開發(fā)最頭疼的問題之一就是32 位數(shù)據(jù)字節(jié)序不統(tǒng)一。 PLC 的 DINT32 位有符號整數(shù)、REAL32 位浮點數(shù)占用 2 個連續(xù) 16 位寄存器不同廠商設(shè)備字節(jié)排布五花八門西門子標(biāo)準(zhǔn)ABCD大端匯川、臺達(dá)、大量國產(chǎn)機器人CDAB、BADC部分小型控制器DCBA小端Windows 自帶htonl/ntohl僅支持大小端轉(zhuǎn)換無法覆蓋 CDAB、BADC 這兩種雙字交換模式。 為此封裝一個通用轉(zhuǎn)換函數(shù)一次調(diào)用輸出 4 種主流字節(jié)序調(diào)試、適配多品牌 PLC 非常方便。運行環(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è)備場景ABCDA B C D0x11223344西門子、標(biāo)準(zhǔn)大端CDABC D A B0x33441122大量國產(chǎn) PLC、機器人BADCB A D C0x22114433部分運動控制器、儀表DCBAD C B A0x44332211小端模式完整源碼/** * brief 32位DINT四種字節(jié)序轉(zhuǎn)換函數(shù) * param input 原始32位有符號整數(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上位機通信 */ 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個字節(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)用示例 單元測試#include iostream using namespace std; int main() { int ABCD, CDAB, BADC, DCBA; // 測試樣例 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ù)要點說明1. 為什么先轉(zhuǎn) unsigned int 拆分原始參數(shù)int是有符號類型。 如果數(shù)值為負(fù)數(shù)直接input 24會觸發(fā)算術(shù)右移高位補 1字節(jié)拆分出錯。 先強制轉(zhuǎn)為unsigned int保證邏輯右移高低字節(jié)拆分永遠(yuǎn)穩(wěn)定。2. 移位操作強制轉(zhuǎn)換 unsigned intunsigned char直接左移 24 位會提升為有符號 int存在符號溢出隱患。(unsigned int)C 24保證移位全程無符號運算規(guī)避未定義行為。3. 空指針判斷工控軟件必備上位機軟件外部調(diào)用邏輯復(fù)雜如果外部傳入 nullptr不做判斷會直接觸發(fā)訪問異常、程序閃退。工業(yè)代碼穩(wěn)定性優(yōu)先。4. 拓展同時支持 32 位浮點數(shù) REALPLC 32 位浮點 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)新聞

JWTDecode.swift單元測試實踐:確保JWT解析功能可靠

JWTDecode.swift單元測試實踐:確保JWT解析功能可靠

JWTDecode.swift單元測試實踐:確保JWT解析功能可靠 【免費下載鏈接】JWTDecode.swift A JWT decoder for iOS, macOS, tvOS, and watchOS 項目地址: https://gitcode.com/gh_mirrors/jw/JWTDecode.swift JWTDecode.swift是一款為iOS、macOS、tvOS和watchOS平…

2026/7/30 23:54:12 閱讀更多
Codex不只是寫代碼:AI Agent工作流為什么必須加入驗證、權(quán)限和交付閉環(huán)?

Codex不只是寫代碼:AI Agent工作流為什么必須加入驗證、權(quán)限和交付閉環(huán)?

很多人第一次使用Codex,會把它理解成“能夠自己修改代碼的ChatGPT”。于是工作方式變成:描述需求,讓Agent讀取倉庫、修改文件、運行測試,最后把結(jié)果交回來。只要代碼看起來能運行,任務(wù)似乎就完成了。但當(dāng)Codex開始同時…

2026/7/30 23:54:12 閱讀更多
Codex任務(wù)中斷的真實成本:ChatGPT Plus與Pro應(yīng)該怎么選?

Codex任務(wù)中斷的真實成本:ChatGPT Plus與Pro應(yīng)該怎么選?

很多開發(fā)者第一次考慮從ChatGPT Plus升級到Pro,并不是因為模型回答不夠聰明,而是因為Codex任務(wù)執(zhí)行到一半時,使用額度突然不足。代碼已經(jīng)分析了一半,測試環(huán)境剛剛跑通,Agent也理解了項目結(jié)構(gòu),卻無法繼續(xù)執(zhí)行…

2026/7/30 23:54:12 閱讀更多