本文用一种极为傻瓜但高效的方式,实现了一种16进制字符串(“FFFFFF”)转10进制字符串(“16777215”)的方法,效果如下:
input hex : FFFFFFFFFFFF
output dec : 281474976710655
...
input hex : 1234567890987654
output dec : 1311768467293632084
...
input hex : FFFFFFFFFFFFFFFF
output dec : 18446744073709551615
起初是想把12位的十六进制字符串转为十进制,找了一圈发现基本上都是先转换为数值型的中间变量int、long(long long是c++11的,开发环境没到),再转换为十进制字符串。这样会导致一个问题就是溢出,当十六进制表示的十进制很大的情况下根本无法转换,遂曲线救国,代码如下(打表深得我心啊):
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include "time.h"
using namespace std;
template<class out_type,class in_value>
out_type convert(const in_value & t)
{
std::stringstream stream;
stream<<t;
out_type result;
stream>>result;
return result;
}
string getDecStr(int hexVal, int hexBit){
string result = "0";
switch(hexVal){
case 0: {result = "0"; break;}
case 1: {
switch(hexBit){
case 0: {result = "1"; break;}
case 1: {result = "16"; break;}
case 2: {result = "256"; break;}
case 3: {result = "4096"; break;}
case 4: {result = "65536"; break;}
case 5: {result = "1048576"; break;}
case 6: {result = "16777216"; break;}
case 7: {result = "268435456"; break;}
case 8: {result = "4294967296"; break;}
case 9: {result = "68719476736"; break;}
case 10: {result = "1099511627776"; break;}
case 11: {result = "17592186044416"; break;}
case 12: {result = "281474976710656"; break;}
case 13: {result = "4503599627370496"; break;}
case 14: {result = "72057594037927936"; break;}
case 15: {result = "1152921504606846976"; break;}
default: break;
}
break;
}
case 2: {
switch(hexBit){
case 0: {result = "2"; break;}
case 1: {result = "32"; break;}
case 2: {result = "512"; break;}
case 3: {result = "8192"; break;}
case 4: {result = "131072"; break;}
case 5: {result = "2097152"; break;}
case 6: {result = "33554432"; break;}
case 7: {result = "536870912"; break;}
case 8: {result = "8589934592"; break;}
case 9: {result = "137438953472"; break;}
case 10: {result = "2199023255552"; break;}
case 11: {result = "35184372088832"; break;}
case 12: {result = "562949953421312"; break;}
case 13: {result = "9007199254740992"; break;}
case 14: {result = "144115188075855872"; break;}
case 15: {result = "2305843009213693952"; break;}
default: break;
}
break;
}
case 3: {
switch(hexBit){
case 0: {result = "3"; break;}
case 1: {result = "48"; break;}
case 2: {result = "768"; break;}
case 3: {result = "12288"; break;}
case 4: {result = "196608"; break;}
case 5: {result = "3145728"; break;}
case 6: {result = "50331648"; break;}
case 7: {result = "805306368"; break;}
case 8: {result = "12884901888"; break;}
case 9: {result = "206158430208"; break;}
case 10: {result = "3298534883328"; break;}
case 11: {result = "52776558133248"; break;}
case 12: {result = "844424930131968"; break;}
case 13: {result = "13510798882111488"; break;}
case 14: {result = "216172782113783808"; break;}
case 15: {result = "3458764513820540928"; break;}
default: break;
}
break;
}
case 4: {
switch(hexBit){
case 0: {result = "4"; break;}
case 1: {result = "64"; break;}
case 2: {result = "1024"; break;}
case 3: {result = "16384"; break;}
case 4: {result = "262144"; break;}
case 5: {result = "4194304"; break;}
case 6: {result = "67108864"; break;}
case 7: {result = "1073741824"; break;}
case 8: {result = "17179869184"; break;}
case 9: {result = "274877906944"; break;}
case 10: {result = "4398046511104"; break;}
case 11: {result = "70368744177664"; break;}
case 12: {result = "1125899906842624"; break;}
case 13: {result = "18014398509481984"; break;}
case 14: {result = "288230376151711744"; break;}
case 15: {result = "4611686018427387904"; break;}
default: break;
}
break;
}
case 5: {
switch(hexBit){
case 0: {result = "5"; break;}
case 1: {result = "80"; break;}
case 2: {result = "1280"; break;}
case 3: {result = "20480"; break;}
case 4: {result = "327680"; break;}
case 5: {result = "5242880"; break;}
case 6: {result = "83886080"; break;}
case 7: {result = "1342177280"; break;}
case 8: {result = "21474836480"; break;}
case 9: {result = "343597383680"; break;}
case 10: {result = "5497558138880"; break;}
case 11: {result = "87960930222080"; break;}
case 12: {result = "1407374883553280"; break;}
case 13: {result = "22517998136852480"; break;}
case 14: {result = "360287970189639680"; break;}
case 15: {result = "5764607523034234880"; break;}
default: break;
}
break;
}
case 6: {
switch(hexBit){
case 0: {result = "6"; break;}
case 1: {result = "96"; break;}
case 2: {result = "1536"; break;}
case 3: {result = "24576"; break;}
case 4: {result = "393216"; break;}
case 5: {result = "6291456"; break;}
case 6: {result = "100663296"; break;}
case 7: {result = "1610612736"; break;}
case 8: {result = "25769803776"; break;}
case 9: {result = "412316860416"; break;}
case 10: {result = "6597069766656"; break;}
case 11: {result = "105553116266496"; break;}
case 12: {result = "1688849860263936"; break;}
case 13: {result = "27021597764222976"; break;}
case 14: {result = "432345564227567616"; break;}
case 15: {result = "6917529027641081856"; break;}
default: break;
}
break;
}
case 7: {
switch(hexBit){
case 0: {result = "7"; break;}
case 1: {result = "112"; break;}
case 2: {result = "1792"; break;}
case 3: {result = "28672"; break;}
case 4: {result = "458752"; break;}
case 5: {result = "7340032"; break;}
case 6: {result = "117440512"; break;}
case 7: {result = "1879048192"; break;}
case 8: {result = "30064771072"; break;}
case 9: {result = "481036337152"; break;}
case 10: {result = "7696581394432"; break;}
case 11: {result = "123145302310912"; break;}
case 12: {result = "1970324836974592"; break;}
case 13: {result = "31525197391593472"; break;}
case 14: {result = "504403158265495552"; break;}
case 15: {result = "8070450532247928832"; break;}
default: break;
}
break;
}
case 8: {
switch(hexBit){
case 0: {result = "8"; break;}
case 1: {result = "128"; break;}
case 2: {result = "2048"; break;}
case 3: {result = "32768"; break;}
case 4: {result = "524288"; break;}
case 5: {result = "8388608"; break;}
case 6: {result = "134217728"; break;}
case 7: {result = "2147483648"; break;}
case 8: {result = "34359738368"; break;}
case 9: {result = "549755813888"; break;}
case 10: {result = "8796093022208"; break;}
case 11: {result = "140737488355328"; break;}
case 12: {result = "2251799813685248"; break;}
case 13: {result = "36028797018963968"; break;}
case 14: {result = "576460752303423488"; break;}
case 15: {result = "9223372036854775808"; break;}
default: break;
}
break;
}
case 9: {
switch(hexBit){
case 0: {result = "9"; break;}
case 1: {result = "144"; break;}
case 2: {result = "2304"; break;}
case 3: {result = "36864"; break;}
case 4: {result = "589824"; break;}
case 5: {result = "9437184"; break;}
case 6: {result = "150994944"; break;}
case 7: {result = "2415919104"; break;}
case 8: {result = "38654705664"; break;}
case 9: {result = "618475290624"; break;}
case 10: {result = "9895604649984"; break;}
case 11: {result = "158329674399744"; break;}
case 12: {result = "2533274790395904"; break;}
case 13: {result = "40532396646334464"; break;}
case 14: {result = "648518346341351424"; break;}
case 15: {result = "10376293541461622784"; break;}
default: break;
}
break;
}
case 10: {
switch(hexBit){
case 0: {result = "10"; break;}
case 1: {result = "160"; break;}
case 2: {result = "2560"; break;}
case 3: {result = "40960"; break;}
case 4: {result = "655360"; break;}
case 5: {result = "10485760"; break;}
case 6: {result = "167772160"; break;}
case 7: {result = "2684354560"; break;}
case 8: {result = "42949672960"; break;}
case 9: {result = "687194767360"; break;}
case 10: {result = "10995116277760"; break;}
case 11: {result = "175921860444160"; break;}
case 12: {result = "2814749767106560"; break;}
case 13: {result = "45035996273704960"; break;}
case 14: {result = "720575940379279360"; break;}
case 15: {result = "11529215046068469760"; break;}
default: break;
}
break;
}
case 11: {
switch(hexBit){
case 0: {result = "11"; break;}
case 1: {result = "176"; break;}
case 2: {result = "2816"; break;}
case 3: {result = "45056"; break;}
case 4: {result = "720896"; break;}
case 5: {result = "11534336"; break;}
case 6: {result = "184549376"; break;}
case 7: {result = "2952790016"; break;}
case 8: {result = "47244640256"; break;}
case 9: {result = "755914244096"; break;}
case 10: {result = "12094627905536"; break;}
case 11: {result = "193514046488576"; break;}
case 12: {result = "3096224743817216"; break;}
case 13: {result = "49539595901075456"; break;}
case 14: {result = "792633534417207296"; break;}
case 15: {result = "12682136550675316736"; break;}
default: break;
}
break;
}
case 12: {
switch(hexBit){
case 0: {result = "12"; break;}
case 1: {result = "192"; break;}
case 2: {result = "3072"; break;}
case 3: {result = "49152"; break;}
case 4: {result = "786432"; break;}
case 5: {result = "12582912"; break;}
case 6: {result = "201326592"; break;}
case 7: {result = "3221225472"; break;}
case 8: {result = "51539607552"; break;}
case 9: {result = "824633720832"; break;}
case 10: {result = "13194139533312"; break;}
case 11: {result = "211106232532992"; break;}
case 12: {result = "3377699720527872"; break;}
case 13: {result = "54043195528445952"; break;}
case 14: {result = "864691128455135232"; break;}
case 15: {result = "13835058055282163712"; break;}
default: break;
}
break;
}
case 13: {
switch(hexBit){
case 0: {result = "13"; break;}
case 1: {result = "208"; break;}
case 2: {result = "3328"; break;}
case 3: {result = "53248"; break;}
case 4: {result = "851968"; break;}
case 5: {result = "13631488"; break;}
case 6: {result = "218103808"; break;}
case 7: {result = "3489660928"; break;}
case 8: {result = "55834574848"; break;}
case 9: {result = "893353197568"; break;}
case 10: {result = "14293651161088"; break;}
case 11: {result = "228698418577408"; break;}
case 12: {result = "3659174697238528"; break;}
case 13: {result = "58546795155816448"; break;}
case 14: {result = "936748722493063168"; break;}
case 15: {result = "14987979559889010688"; break;}
default: break;
}
break;
}
case 14: {
switch(hexBit){
case 0: {result = "14"; break;}
case 1: {result = "224"; break;}
case 2: {result = "3584"; break;}
case 3: {result = "57344"; break;}
case 4: {result = "917504"; break;}
case 5: {result = "14680064"; break;}
case 6: {result = "234881024"; break;}
case 7: {result = "3758096384"; break;}
case 8: {result = "60129542144"; break;}
case 9: {result = "962072674304"; break;}
case 10: {result = "15393162788864"; break;}
case 11: {result = "246290604621824"; break;}
case 12: {result = "3940649673949184"; break;}
case 13: {result = "63050394783186944"; break;}
case 14: {result = "1008806316530991104"; break;}
case 15: {result = "16140901064495857664"; break;}
default: break;
}
break;
}
case 15: {
switch(hexBit){
case 0: {result = "15"; break;}
case 1: {result = "240"; break;}
case 2: {result = "3840"; break;}
case 3: {result = "61440"; break;}
case 4: {result = "983040"; break;}
case 5: {result = "15728640"; break;}
case 6: {result = "251658240"; break;}
case 7: {result = "4026531840"; break;}
case 8: {result = "64424509440"; break;}
case 9: {result = "1030792151040"; break;}
case 10: {result = "16492674416640"; break;}
case 11: {result = "263882790666240"; break;}
case 12: {result = "4222124650659840"; break;}
case 13: {result = "67553994410557440"; break;}
case 14: {result = "1080863910568919040"; break;}
case 15: {result = "17293822569102704640"; break;}
default: break;
}
break;
}
default:
break;
}
return result;
}
string addStrings(string num1, string num2)
{
int i = static_cast<int>(num1.length() - 1);
int j = static_cast<int>(num2.length() - 1);
int add = 0;
string ans = "";
while (i >= 0 || j >= 0 || add != 0)
{
int x = i >= 0 ? num1[unsigned(i)] - '0' : 0;
int y = j >= 0 ? num2[unsigned(j)] - '0' : 0;
int result = x + y + add;
ans.push_back(static_cast<char>('0' + result % 10));
add = result / 10;
i -= 1;
j -= 1;
}
reverse(ans.begin(), ans.end());
return ans;
}
string hexConvert2Dec(string value)
{
string::size_type i = 0;
string tmpVal;
char charVal;
int intVal = 0;
tmpVal = convert<string>(intVal);
for (i = 0; i < value.length(); ++i){
charVal = value[value.length() - i - 1];
if (charVal >= 'A' && charVal <= 'F'){
intVal = charVal - 'A' + 10;
}
else if (charVal >= 'a' && charVal <= 'f'){
intVal = charVal - 'a' + 10;
}
else{
intVal = charVal - '0';
}
tmpVal = addStrings(tmpVal, getDecStr(intVal, int(i)));
}
return tmpVal;
}
int main(){
string hexstr("FFFFFFFFFFFFFFFF");
cout << "input hex : " << hexstr << endl;
clock_t sProDes = clock();
cout << "output dec : " << hexConvert2Dec(hexstr) << endl;
clock_t eProDes = clock();
cout<<"time: "<<static_cast<double>(eProDes-sProDes)/CLOCKS_PER_SEC<<endl;
return 0;
}