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

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


运行结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值