首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC++ 十六進制字符串轉文本:CString "1A 2B" → 字符數組完整實現

     編輯:程式設計綜合問答

問題

給定 CString a = "1A 2B",需將每兩個十六進制字符轉為一個字節,存入另一個 CString 或 char*。

核心算法

  1. 移除空格/分隔符
  2. 每兩字符一組,高 4 位 × 16 + 低 4 位
  3. 轉換函數:'0'-'9' → 0-9,'A'-'F'/'a'-'f' → 10-15

完整代碼 (MFC/ATL)

CString HexStrToText(const CString& hexStr)
{
    // 1. 清理空格
    CString clean = hexStr;
    clean.Remove(' '); // 也可 Remove('\t') 等
    
    if (clean.GetLength() % 2 != 0) 
        return _T(""); // 長度必須為偶數
    
    // 2. 輸出緩衝區
    int outLen = clean.GetLength() / 2;
    CStringA result; // ANSI 字符串接收字節
    result.GetBufferSetLength(outLen);
    char* pOut = result.GetBuffer();
    
    // 3. 輔助轉換 Lambda
    auto charToVal = [](TCHAR ch) -> int {
        if (ch >= _T('0') && ch <= _T('9')) return ch - _T('0');
        if (ch >= _T('A') && ch <= _T('F')) return ch - _T('A') + 10;
        if (ch >= _T('a') && ch <= _T('f')) return ch - _T('a') + 10;
        return -1; // 非法字符
    };
    
    // 4. 逐對轉換
    LPCTSTR pIn = clean;
    for (int i = 0; i < outLen; ++i) {
        int high = charToVal(pIn[i * 2]);
        int low  = charToVal(pIn[i * 2 + 1]);
        if (high < 0 || low < 0) { result.ReleaseBuffer(); return _T(""); }
        pOut[i] = static_cast((high << 4) | low);
    }
    
    result.ReleaseBuffer(outLen);
    return CString(result); // 隱式轉為 CString (視項目字符集而定)
}

關鍵點解析

環節注意事項
字符集項目為 Unicode 時,CString 存 wchar_t,轉換後字節建議存 CStringA 或 std::string
異常處理非法字符、奇數長度、空指針需防御
性能預分配緩衝區、避免逐字符拼接

調用示例

CString input = _T("1A 2B 3C 4D");
CString output = HexStrToText(input);
// output 內部字節為 {0x1A, 0x2B, 0x3C, 0x4D}
// 若需顯示可再轉為十六進制 Dump

反向操作:字節 → 十六進制字符串

CString TextToHexStr(const BYTE* data, int len)
{
    CString hex;
    for (int i = 0; i < len; ++i)
        hex.AppendFormat(_T("%02X "), data[i]);
    return hex.TrimRight(); // "1A 2B 3C 4D"
}

掌握十六進制字符串與二進制數據互轉,是嵌入式/網絡/協議開發的基礎技能。

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