java版在这里: http://blog.csdn.net/rocklee/article/details/46470047
由于在gen key方面压缩数据,所以在C++方面也用上了, 今天将java版翻译了一遍:
#include "Utils.h"
#include <math.h>
#include <stack>
#include <assert.h>
namespace freestyle {
string C_CODES_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$.`";
/***
* 任何进制转换,
* @param s
* @param srcBase s的进制
* @param destBase 要转换为的进制
* @return
*/
string BaseConvert(string s, int srcBase, int destBase) {
/*if (C_CODES_STRING.size() == 0) {
C_CODES_STRING.append("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$.`");
}*/
if (srcBase == destBase) {
return s;
}
if (destBase != 10) {//目标进制不是十进制 先转化为十进制
s = BaseConvert(s, srcBase, 10);
}
else {
size_t lvSize = s.size();
assert((size_t)destBase <= C_CODES_STRING.size());
char* lvChars = new char[lvSize+1];
memset(lvChars, 0, lvSize+1);
strcpy_s(lvChars, lvSize+1, s.data());
long long n = 0;
for (int i = lvSize - 1; i >= 0; i--) {
n += C_CODES_STRING.find(lvChars[i])*(long long)(pow(srcBase, lvSize - i - 1));
}
delete[] lvChars;
return to_string(n);
}
return int2CodeString(stoll(s), destBase);
}
string int2CodeString(long long intVal)
{
return int2CodeString(intVal, C_CODES_STRING.length());
}
string int2CodeString(long long intVal, int base) {
/*char lvBuf[1024];
_i64toa_s(intVal, lvBuf, 1024, base);
return string(lvBuf);*/
int lviCodeLen = C_CODES_STRING.length();
assert(base <= lviCodeLen);
string sb;
stack<char>s;
while (intVal != 0) {
char lvC = C_CODES_STRING.at((int)(intVal%base));
s.push(lvC);
intVal /= base;
}
while (!s.empty()) {
char lvC = s.top();
sb.push_back(lvC);
s.pop();
//delete lvcTmp;
}
return sb.size() == 0 ? "0" : sb;
}
}
调用例子:
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
long long lvT = 9999999999;
int lvBases[] ={ 2,4,8,16,32,42 }; //分别将10进制转为2/4/8/16/32/42进制,然后再转回10进制.
for (int i = 0; i < sizeof(lvBases)/sizeof(int);++i){
string lvsRet = freestyle::BaseConvert(to_string(lvT), 10, lvBases[i]);
long long lvllCvt = atoll(freestyle::BaseConvert(lvsRet, lvBases[i], 10).data());
assert(lvllCvt == lvT);
cout << lvT << "==>("<<lvBases[i]<<" base)," << lvsRet <<"==>(10 base),"<<lvllCvt<< endl;
cout << endl;
}
//cout << atoll(freestyle::BaseConvert(lv42, 42, 10).data()) << endl;
getchar();
return 0;
}