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

来源:互联网 发布:重庆华人数据恢复公司 编辑:程序博客网 时间:2024/04/23 22:39

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进制的1234567890class 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和\0str = new char[sz];str[sz-1] = '\0';str[sz-2] = 'R';IntToChar(n,str,sz-2);}//int转为char,不会在字符串尾部添加\0void 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'){//空串返回NULLreturn 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