任意長度十進制字符串轉十六進制字符串

所謂十進制轉換十六進制,其實就是要了解轉換原理,再把數學邏輯翻譯成代碼邏輯;

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章