123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- /********************************************************************
- created: 2016-5-25
- desc: 10进制与x进制的相互转换
- author: 陈刚
- purpose: 如有问题与我联系 QQ: 17448470
- *********************************************************************/
- #pragma once
- #include "stdafx.h"
- #include "string_util.h"
- //10进制和x进制的换算
- class CBaseDigitalConv
- {
- public:
- CBaseDigitalConv(){}
- virtual ~CBaseDigitalConv(){}
-
- public:
- //10进制转化成的x进制长度,不足nMinLen长度的话高位补0,否则不改变什么
- string to_x(const string& src10, int nMinLen)
- {
- string dst;
- uint64_t src = stringToint64(src10);
- while(src != 0){
- int nMod = src % m_nDigital;
- char szTmp[2];
- szTmp[0] = m_charSet[nMod];
- szTmp[1] = 0;
- dst.append(szTmp);
-
- src = src / m_nDigital;
- }
-
- reverse(dst.begin(), dst.end());
- string str = convMinLen(dst, nMinLen);
- return str;
- }
- //x进制转为10进制
- string to_10(const string& srcx, int nMinLen)
- {
- uint64_t dst = 0L;
- for(int i=0; i<srcx.length(); i++)
- {
- char c = srcx[i];
- for(int j=0; j<strlen(m_charSet); j++)
- {
- if(c == m_charSet[j])
- {
- dst = (dst * m_nDigital) + j;
- break;
- }
- }
- }
-
- string str = convMinLen(int64Tostring(dst), nMinLen);
- return str;
- }
-
- protected:
- static string convMinLen(const string& src, int nMinLen)
- {
- int nAddLen = nMinLen - src.length();
- string strTmp;
- for(int i=0; i<nAddLen; i++)
- {
- strTmp += "0";
- }
- return strTmp + src;
- }
- //初始化,设置字符集
- void init(const char* charSet)
- {
- strcpy(m_charSet, charSet);
- m_nDigital = strlen(m_charSet);
- }
- private:
- char m_charSet[128];
- int m_nDigital;
- };
- //10进制和62进制的换算,如 0120160524121052485 --》 00008sKrPTsBmv
- class CDigitalConv62 : public CBaseDigitalConv
- {
- public:
- CDigitalConv62()
- {
- init("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
- }
- virtual ~CDigitalConv62(){}
- };
- //10进制和90进制的换算,如 0120160524121052485 --》 R;NKOY[U.
- class CDigitalConv90 : public CBaseDigitalConv
- {
- public:
- CDigitalConv90()
- {
- init("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-=[]{}|;:,./<>?");
- }
- virtual ~CDigitalConv90(){}
- };
- /*
- 测试例子:
- //0120160524121052485 --》 00008sKrPTsBmv
- CDigitalConv62 d62;
- string str10 = d62.to_10("00008sKrPTsBmv", 0);
- str10 = d62.to_10("00008sKrPTsBmv", 19);
- string str62 = d62.to_x("0120160524121052485", 0);
- str62 = d62.to_x("0120160524121052485", 14);
- //0120160524121052485 --》 R;NKOY[U.
- CDigitalConv90 d90;
- str10 = d90.to_10("R;NKOY[U.", 0);
- string str90 = d90.to_x("0120160524121052485", 0);
- */
|