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