所謂十進制轉換十六進制,其實就是要了解轉換原理,再把數學邏輯翻譯成代碼邏輯;
比如十進制字符串 "12345678" 轉換之後爲 "BC614E";
順帶普及下十六進制值:
十六進制,顧名思義,就是每個字符位的取值範圍爲 0~15;
其中:
十進制值 十六進制值
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 a/A
11 b/B
12 c/C
13 d/D
14 e/E
15 f/F
數學運算過程如下:
除法運算第一步:
771604
_____________
16 | 12345678
112
---------------------
114
112
---------------------
25
16
---------------------
96
96
---------------------
078
64
---------------------
14
除法運算過程,小學知識,就當大家都會吧;
最後得到餘數14,對應十六進制符號就是'E'
除法運算第二步:
48225
__________________
16 | 771604
64
----------------------
131
128
----------------------
36
32
----------------------
40
32
----------------------
84
80
----------------------
4
.
.
.
省略吧,後面的就不羅嗦了,之後算出來的餘數分別爲
1 6 12 11
分別對應十六進制字符爲
1 6 C B
所謂餘數,就是剩餘的數量,當然是越先算出來,地位就越低,
所以,最終結果是 BC614E ;
常規表示十六進制加前綴 0xBC614E ;
當然,我們這裏需要的是字符串形式,也就不需要前綴了,直接就是 "BC614E";
以下臨時寫的算法,雖然不算很好,但也能實現轉換過程,當個參考吧:
void DocStrToHexStr(const IN std::string& sSource, OUT std::string& sDesc)
{
sDesc.clear();
std::string sTmp = sSource;// 被除數
std::string sSubSrc;// 除法整數倍
std::string sSubDesc;// 緩存16進制逆序結果
while (sTmp.length() > 0)
{
DWORD dwZhengShu = 0;// 整數
DWORD dwYuShu = 0;// 餘數
DWORD dwSubSrc = 0;// 可被16整除的最小整數
for (int i = 0; i < sTmp.length(); i++)
{
dwSubSrc *= 10;
dwSubSrc += sTmp[i] - '0';
dwYuShu = dwSubSrc;
if (dwSubSrc >= 16)
{
dwZhengShu = dwSubSrc / 16;
dwYuShu = dwSubSrc % 16;
sSubSrc.push_back(dwZhengShu + '0');
dwSubSrc = dwYuShu;
}
else if (sSubSrc.length())
{
sSubSrc.push_back('0');
}
}
if (dwYuShu >= 10)
sSubDesc.push_back('A' + dwYuShu - 10);
if (sSubSrc.empty())
{
if (dwSubSrc >= 10)
sSubDesc.push_back('A' + dwSubSrc - 10);
else
sSubDesc.push_back(dwSubSrc + '0');
}
else
{
if(dwYuShu < 10)
sSubDesc.push_back(dwYuShu + '0');
}
sTmp = sSubSrc;
sSubSrc.clear();
}
for (auto it = sSubDesc.rbegin(); it != sSubDesc.rend(); ++it)
{
sDesc.push_back(*it);// 逆序輸出
}
}
最後,或許有人不懂 dwZhengShu + '0' 是什麼意思,
解釋下,比如
DWORD dwZhengShu = 1;
char cData = dwZhengShu + '0';
//最終得到cData='1'
//很明顯這個過程就是實現數字到字符的轉換過程
//反過來, ('1' - '0') 就是把字符 '1' 轉成數字 1