首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC 將 DWORD IP 地址轉換為 CString 點分十進制字符串

     編輯:關於VC++

標準解析方法


DWORD dwIPAddr = 0xC0A80101; // 示例:192.168.1.1
CString strIP;

WORD hiWord = HIWORD(dwIPAddr);  // 高 16 位:192.168
WORD loWord = LOWORD(dwIPAddr);  // 低 16 位:1.1

BYTE n1 = HIBYTE(hiWord); // 192
BYTE n2 = LOBYTE(hiWord); // 168
BYTE n3 = HIBYTE(loWord); // 1
BYTE n4 = LOBYTE(loWord); // 1

strIP.Format(_T("%d.%d.%d.%d"), n1, n2, n3, n4);
// 結果:"192.168.1.1"

網絡字節序陷阱

關鍵:IP 控件 (CIPAddressCtrl) 返回的 DWORD 通常為**主機字節序**(小端序),即內存中低位在前:


// 內存佈局 (小端序)
地址:   基址    基址+1  基址+2  基址+3
值:      1       1       168     192   // 對應 192.168.1.1

上述 HIWORD/LOWORD/HIBYTE/LOBYTE 組合**恰好**匹配小端序佈局,直接得到正確順序。

如果是網絡字節序 (大端序) 怎麼辦?


// 網絡序:192.168.1.1 → 0xC0A80101 (內存: C0 A8 01 01)
// 需用 ntohl 轉換
DWORD dwHostOrder = ntohl(dwNetworkOrder);
// 然後再用上述方法解析

一行代碼版 (利用聯合體/指針轉換)


// 僅限小端序架構 (x86/x64)
BYTE* p = (BYTE*)&dwIPAddr;
strIP.Format(_T("%d.%d.%d.%d"), p[3], p[2], p[1], p[0]);
// 注意:嚴格違反 C++ 嚴格別名規則,但 MSVC 允許且極其常用

MFC 專用簡化寫法


// CIPAddressCtrl 直接獲取字符串
CString strIP;
m_ipCtrl.GetWindowText(strIP); // 自動格式化為 "192.168.1.1"

// 或使用 GetAddress 配合格式化
DWORD dwAddr;
m_ipCtrl.GetAddress(dwAddr); // 返回 DWORD,同本文解析方法

反向操作:字符串轉 DWORD


DWORD StringToIP(LPCTSTR szIP)
{
    int n1, n2, n3, n4;
    if (_stscanf_s(szIP, _T("%d.%d.%d.%d"), &n1, &n2, &n3, &n4) != 4) return 0;
    if (n1<0||n1>255||n2<0||n2>255||n3<0||n3>255||n4<0||n4>255) return 0;
    return MAKELONG(MAKEWORD(n3, n4), MAKEWORD(n1, n2)); // 注意字節序!
}

IPv6 提示

IPv6 地址 (128 位) 無法用 DWORD 存儲,需使用 in6_addr 結構體或 CString 直接處理,MFC 無原生 IPv6 控件,建議用編輯框 + 正則驗證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved