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