digital_conv.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /********************************************************************
  2. created: 2016-5-25
  3. desc: 10进制与x进制的相互转换
  4. author: 陈刚
  5. purpose: 如有问题与我联系 QQ: 17448470
  6. *********************************************************************/
  7. #pragma once
  8. #include "string_util.h"
  9. //10进制和x进制的换算
  10. class CBaseDigitalConv
  11. {
  12. public:
  13. CBaseDigitalConv(){}
  14. virtual ~CBaseDigitalConv(){}
  15. public:
  16. //10进制转化成的x进制长度,不足nMinLen长度的话高位补0,否则不改变什么
  17. string to_x(const string& src10, int nMinLen)
  18. {
  19. string dst;
  20. uint64_t src = stringToint64(src10);
  21. while(src != 0){
  22. int nMod = src % m_nDigital;
  23. char szTmp[2];
  24. szTmp[0] = m_charSet[nMod];
  25. szTmp[1] = 0;
  26. dst.append(szTmp);
  27. src = src / m_nDigital;
  28. }
  29. reverse(dst.begin(), dst.end());
  30. string str = convMinLen(dst, nMinLen);
  31. return str;
  32. }
  33. //x进制转为10进制
  34. string to_10(const string& srcx, int nMinLen)
  35. {
  36. uint64_t dst = 0L;
  37. for(int i=0; i<srcx.length(); i++)
  38. {
  39. char c = srcx[i];
  40. for(int j=0; j<strlen(m_charSet); j++)
  41. {
  42. if(c == m_charSet[j])
  43. {
  44. dst = (dst * m_nDigital) + j;
  45. break;
  46. }
  47. }
  48. }
  49. string str = convMinLen(int64Tostring(dst), nMinLen);
  50. return str;
  51. }
  52. protected:
  53. static string convMinLen(const string& src, int nMinLen)
  54. {
  55. int nAddLen = nMinLen - src.length();
  56. string strTmp;
  57. for(int i=0; i<nAddLen; i++)
  58. {
  59. strTmp += "0";
  60. }
  61. return strTmp + src;
  62. }
  63. //初始化,设置字符集
  64. void init(const char* charSet)
  65. {
  66. strcpy(m_charSet, charSet);
  67. m_nDigital = strlen(m_charSet);
  68. }
  69. private:
  70. char m_charSet[128];
  71. int m_nDigital;
  72. };
  73. //10进制和62进制的换算,如 0120160524121052485 --》 00008sKrPTsBmv
  74. class CDigitalConv62 : public CBaseDigitalConv
  75. {
  76. public:
  77. CDigitalConv62()
  78. {
  79. init("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
  80. }
  81. virtual ~CDigitalConv62(){}
  82. };
  83. //10进制和90进制的换算,如 0120160524121052485 --》 R;NKOY[U.
  84. class CDigitalConv90 : public CBaseDigitalConv
  85. {
  86. public:
  87. CDigitalConv90()
  88. {
  89. init("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-=[]{}|;:,./<>?");
  90. }
  91. virtual ~CDigitalConv90(){}
  92. };
  93. /*
  94. 测试例子:
  95. //0120160524121052485 --》 00008sKrPTsBmv
  96. CDigitalConv62 d62;
  97. string str10 = d62.to_10("00008sKrPTsBmv", 0);
  98. str10 = d62.to_10("00008sKrPTsBmv", 19);
  99. string str62 = d62.to_x("0120160524121052485", 0);
  100. str62 = d62.to_x("0120160524121052485", 14);
  101. //0120160524121052485 --》 R;NKOY[U.
  102. CDigitalConv90 d90;
  103. str10 = d90.to_10("R;NKOY[U.", 0);
  104. string str90 = d90.to_x("0120160524121052485", 0);
  105. */