所谓十进制转换十六进制,其实就是要了解转换原理,再把数学逻辑翻译成代码逻辑;
比如十进制字符串 "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