1、输入一个最大的数,确定需要的多少个32进制位
int GetDigitNum32(unsigned int max)
{
int off;
int num;
off = 5;
num = 0;
while(max)
{
max = max >> off;
num++;
}
return num;
}
2、无符号数转换成字符
char* NumToChar(unsigned int num, int base,char* buf, int max_digit)
{
int i;
int mod_res;
unsigned int tmp;
assert(base >= 2 && base <= 32);
if(max_digit > 15)
max_digit = 15;
buf[max_digit] = 0;
for(i=max_digit - 1; i >= 0; i--)
{
mod_res = num % base;
num -= mod_res;
num /= base;
if(mod_res >= 0 && mod_res <= 9)
{
mod_res += '0';
buf[i] = mod_res;
}
else
{
buf[i] = mod_res - 10 + 'A';
}
}
return buf;
}
3、数转换成32进制的字符串
char* NumToChar32(unsigned int num,char* buf, int max_digit)
{
int i;
int mod_res;
int off;
if(max_digit > 15)
max_digit = 15;
buf[max_digit] = 0;
off = 0;
for(i=max_digit - 1; i >= 0; i--)
{
mod_res = (num >> off) & 0x01F;
if(mod_res >= 0 && mod_res <= 9)
{
mod_res += '0';
buf[i] = mod_res;
}
else
{
buf[i] = mod_res - 10 + 'A';
}
off += 5;
if(off >= 31)
off = 31;
}
return buf;
}
4、32进制的字符串转换成数:
unsigned int Char32ToNum(char* str, int len)
{
int i;
int s;
unsigned int num;
for(i = 0; i < len; i++)
{
if((str[i] >= '0' && str[i] <= '9'))
{
break;
}
else if((str[i] >= 'A' && str[i] <= 'V'))
{
break;
}
else
{
continue;
}
}
s = i;
if(s == len - 1)
return MAX_NUM;
num = 0;
for(i = s; i < len; i++)
{
if(str[i] >= '0' && str[i] <= '9')
{
num <<= 5;
num += (str[i] - '0');
}
else if(str[i] >= 'A' && str[i] <= 'V')
{
num <<= 5;
num += (str[i] - 'A' + 10);
}
else
{
break;
}
}
return num;
}
win32下的测试代码:
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int i;
char buf[32] = {0};
char test[32] = {0};
unsigned int num;
char* str;
int digit;
unsigned int max = atoi("99999999");
digit = GetDigitNum32(max);
str = NumToChar(MAX_TEST, 2,&test[0], 31);
num = Char32ToNum(str, strlen(str));
printf("Hex = %X, 10 = %d, NumTochar = %s\n", MAX_TEST, MAX_TEST, str);
printf("max = %s\n", str);
for(i = 0;i <= 99999999; i++)
{
str = NumToChar32(i, &buf[0],digit);
num = Char32ToNum(buf,strlen(str));
if(num != i)
{
printf("i = %d,buf = %s, erro!!!\n", i, str);
}
}
return 0;
}
测试过的最大数,
#define MAX_NUM 0xFFFFFFFF
#define MAX_TEST 99999999
一个简单数字压缩程序,就成了。