10进制34进制转换

时间:2025-04-20 07:43:58
//10进制34进制转换

//映射表 0~9 A~Z(除去I,O)
static const char Code10Map34[] =
{
  '0','1','2','3','4','5','6','7','8','9',
  'A','B','C','D','E','F','G','H','J','K',
  'L','M','N','P','Q','R','S','T','U','V',
  'W','X','Y','Z',
};

//10进制转为34进制
//uDec 10进制数据
//szCode 34进制字符
//iTgtLen 34进制长度 不足时前面插入0
//返回34进制字符长度
int Dec2ThrityFour(ULONGLONG uDec, CString &szCode, int iTgtLen=1)
{
  (); //清空数据
  iTgtLen = max(1, iTgtLen); //最短1位
  
  do 
  {
    (0, Code10Map34[uDec%34]); //取余
    uDec /= 34; //除34
  } while (uDec != 0); 

  //补足长度
  while(() < iTgtLen)
  {
    (0, '0');
  }

  return (int)();
}

//34进制转换到10进制数据
//szCode 输入34进制字符
//返回10进制数据
ULONGLONG ThrityFour2Dec(LPCTSTR szCode)
{
  ULONGLONG uRet = 0;

  int iMaxLen = szCode? _tcslen(szCode):0; //字符长度
  for(int i=0; i<iMaxLen; i++)
  {
    int a = -1;
    TCHAR t = szCode[i];
    for(int j=0; j<34; j++)
    {
      if(t == Code10Map34[j])
      {
        a = j;
        break;
      }
    }
    ASSERT(a >= 0 && a < 34);
    uRet = uRet*34 + max(0, a);
  }

  return uRet;
}
//测试用例
{
  ULONGLONG ui = 20190330;
  CString s;
  Dec2ThrityFour(ui, s, 4);
  ULONGLONG uo = ThrityFour2Dec(s);
  ASSERT(ui == uo);

  TRACE(_T("%I64u == > %s == >%I64u\n"), ui, (LPCTSTR)s, uo);
  
}

//调试输出
20190330 == > F3PP8 == >20190330