COM组件:完成任意进制到任意进制的转换

1、实现说明:

我先是将任意进制转换成十进制,然后将十进制转换成任意进制

2、代码实现:

#ifndef __HEXCONVERSION_H__
#define __HEXCONVERSION_H__
#include<string>
#include<assert.h>
using std::string;
//数据
//2R0,1						表示2进制的1
//3R0,1,2					表示3进制12
//4R0,1,2,3					表示4进制的123
//5R0,1,2,3,4				表示5进制的1234
//10R1,2,3,4,5,6,7,8,9,0	表示10进制的1234567890
class HexConversion{
public:
	//构造函数
	HexConversion(const char *s = "")
		:_num(new char[strlen(s)+1]){
		memcpy(_num,s,strlen(s)+1);
	}
	HexConversion(const HexConversion & h)
		:_num(NULL){
		HexConversion tmp(h._num);
		swap(_num,tmp._num);
	}
	//析构函数
	~HexConversion(){
		delete []_num;
	}

public:
	//将任意进制转换为10进制
	long long ToTen(){
		char *start = GetHexPtr();		//获取进制后的字符
		long long ret = 0;				//用来保存结果
		int Hex = GetHex();				//获取进制
		int Cube = GetMaxCube();		//获取最高次幂
		while('\0'!=*start){			//开始转换
			char *begin = start;		//单个数字的起始位置
			char *end = start;			//单个数字的结束位置
			while(*end!=',' &&*end!='\0'){	//获取单个数字的区间
				end++;
			}
			ret += GetNum(begin,end)*Pow(Hex,--Cube);	//加权展开
			if(*end=='\0'){				//整个字符串已经遍历完成
				return ret;
			}
			start = end + 1;			//从下一个数字开始继续循环
		}
		return ret;
	}
	//转换N进制
	HexConversion ToNHex(int n){
		long long _num = ToTen();
		char * hex = NULL;
		ToHex(n,hex);
		char * num = NULL;
		ToNum(_num,num,n);
		size_t totalsz = strlen(hex) + strlen(num) + 1;
		char *retstr = new char[totalsz];
		*retstr = '\0';
		strcat(retstr,hex);
		strcat(retstr,num);
		HexConversion ret(retstr);
		delete[] retstr;
		delete[] num;
		delete []hex;

		return ret;
	}
	void Print(){
		cout<<_num<<endl;
	}
	//将一个数转换为N进制,并且构造成x,x,x,x的字符串
	void ToNum(long long n,char * &str,int hex){
		size_t sz = GetCount(n,hex) * 2;
		str = new char[sz];
		str[sz-1] = '\0';
		int flag = -1;
		for(int i=1; n; ++i){
			if(flag>0){
				str[sz-i-1] = ',';
			}else{
				str[sz-i-1] = n%hex + '0';
				n = n/hex;
			}
			flag *= -1;
		}
	}
	//ToHex(1234,str)  str = "1234R"
	void ToHex(int n,char *&str){
		size_t sz = GetCount(n,10)+2;		//多出来两位表示R和\0
		str = new char[sz];
		str[sz-1] = '\0';
		str[sz-2] = 'R';
		IntToChar(n,str,sz-2);
	}
	//int转为char,不会在字符串尾部添加\0
	void IntToChar(int n,char * &str,int sz){
		for(int i=0;i<sz;++i){
			str[sz-i-1] = n%10 + '0';
			n = n/10 ;
		}
	}
	//获取数字n的位数
	long long GetCount(long long n,int hex){
		long long  ret = 0;
		while(n){
			ret++;
			n/=hex;
		}
		return ret;
	}
	//获取N进制数(用于加权展开,转换为N进制)
	int GetHex(){
		assert(GetHexPtr()!=NULL);
		size_t HexLength = GetHexPtr()-_num;	//获取进制字符长度
		char *tmp = new char[HexLength+1];		//开辟新内存
		memcpy(tmp,_num,HexLength);				//拷贝进制字符
		int ret = atoi(tmp);				//将进制字符转换为数字
		delete[] tmp;							//释放开辟空间
		return ret;								//返回_num的进制
	}
	//返回R后的指针,即从数字开始
	char * GetHexPtr(){
		char *start = _num;
		while(*start!='R'&& *start!='\0'){
			++start;		//找字符R
		}
		if(*start=='\0'){	//空串返回NULL
			return 0;
		}
		return ++start;		//返回R字符后的指针
	}
	//将字符区间内的字符转换为数字
	long long GetNum(const char* begin,const char*end){
		char * tmp = new char[end-begin+1];	//新开辟一段内存
		memcpy(tmp,begin,end-begin);		//将字符数字拷贝进去
		long long ret = atoi(tmp);			//将字符转换为数字
		delete []tmp;						//释放空间
		return ret;							//返回结果
	}
	//获取最高次幂(分号的个数)
	int GetMaxCube(){
		int ret = 0;
		char *start = _num;
		while(*start!='\0'){	//遍历字符串
			if(*start==','){	
				++ret;			//遇到分号,计数器加1
			}
			++start;
		}
		return ret;				//返回结果
	}
	//自己写的求次方程序
	long long Pow(long long x,int y){
		long long ret = x;
		//次方大于0,计算乘法
		if(y>0){
			while(y--){
				ret *= x;
			}
		}else{
		//次方小于0,计算除法
			while(y++){
				ret /= x;
			}
		}
		return ret;
	}
private:
	char * _num;
};
#endif
附加说明: 这里我实现的是任意进制到任意进制的转换的具体实现代码,最终要实现的是COM组件,直接可以用MFC做一个可视化界面就可以了,这部分我就不实现了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值