任意长度十进制字符串转十六进制字符串

所谓十进制转换十六进制,其实就是要了解转换原理,再把数学逻辑翻译成代码逻辑;

比如十进制字符串 "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

 

你可能感兴趣的:(C++,十六进制转换,整数字符串转十六进制,十进制字符串转十六进制)