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

    xiaoxiao2021-03-26  27

    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 + '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做一个可视化界面就可以了,这部分我就不实现了。

    转载请注明原文地址: https://ju.6miu.com/read-650301.html

    最新回复(0)