任意进制的数值转换 C++版

来源:互联网 发布:国家统计局2016年数据 编辑:程序博客网 时间:2024/05/19 23:10

   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;}


运行结果:



原创粉丝点击