digital_conv.h 3.1 KB

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