//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