在嵌入式開發、通訊協定解析或除錯工具中,常需在二進制、十進制、十六進制之間互轉。MFC 的 CString 配合標準庫函式即可輕鬆完成。本文提供 BinToDec、DecToBin 兩個核心函式,並示範六種常見轉換路徑。
CString BinToDec(CString strBin)
{
long nDec = 0;
int nLen = strBin.GetLength();
for (int i = 0; i < nLen; ++i) {
if (strBin[nLen - i - 1] == _T('0')) continue;
long k = 1;
for (int j = 0; j < i; ++j) k *= 2;
nDec += k;
}
CString strDec;
strDec.Format(_T("%ld"), nDec);
return strDec;
}
CString DecToBin(CString strDec)
{
int nDec = _ttoi(strDec);
CString strBin;
if (nDec == 0) return _T("0000");
while (nDec > 0) {
int bit = nDec % 2;
nDec /= 2;
strBin.Insert(0, bit ? _T('1') : _T('0'));
}
// 補齊至 4 的倍數
int pad = (4 - strBin.GetLength() % 4) % 4;
strBin = CString(_T('0'), pad) + strBin;
return strBin;
}
| 來源 | 目標 | 程式碼片段 |
|---|---|---|
| 二進制 | 十進制 | CString dec = BinToDec(_T("1110")); |
| 十進制 | 二進制 | CString bin = DecToBin(_T("14")); |
| 二進制 | 十六進制 | CString dec = BinToDec(bin); int n = _ttoi(dec); CString hex; hex.Format(_T("%X"), n); |
| 十進制 | 十六進制 | int n = 10; CString hex; hex.Format(_T("%X"), n); |
| 十六進制 | 十進制 | CString hex = _T("AF"); DWORD dw = _tcstoul(hex, NULL, 16); CString dec; dec.Format(_T("%lu"), dw); |
| 十六進制 | 二進制 | CString hex = _T("AF"); DWORD dw = _tcstoul(hex, NULL, 16); CString dec; dec.Format(_T("%lu"), dw); CString bin = DecToBin(dec); |
若不需自訂格式,可直接使用 _tcstoul、_stprintf 等:
// 任意進制字串 → 長整數
DWORD val = _tcstoul(str, NULL, base); // base = 2, 10, 16
// 長整數 → 任意進制字串
TCHAR buf[33];
_stprintf(buf, _T("%lX"), val); // 十六進制大寫
_stprintf(buf, _T("%ld"), val); // 十進制
// 二進制需自行迴圈或用 bitset (C++11)
unsigned long long 與 %llX / %llu 格式。