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