[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 239
  • Last Modified:

Hexadecimal Data

To convert from hexa to dec, someone (RONSLOW, I think) wrote here some time ago:

int hexa2dec (CString input) {
  char* dummy;
  return strtol(input,&dummy,16);
}

I have used it, and it works as long as the hexa input begins with a number. I mean, I cannot convert the a1e4 value to decimal, for instance.
Why? What can I do?
0
javigil1
Asked:
javigil1
  • 4
  • 4
1 Solution
 
nietodCommented:
The string must begin with "0x" or "0X" to be considered a HEX number string  (it can have whitespace before the 0.)

continues.
0
 
tvanceplusCommented:
Here is some code

int getNumFromChar(char c){
 switch(c){
 case '0':return 0;
 case '1':return 1;
 case '2':return 2;
 case '3':return 3;
 case '4':return 4;
 case '5':return 5;
 case '6':return 6;
 case '7':return 7;
 case '8':return 8;
 case '9':return 9;
 case 'A':
 case 'a':return 10;
 case 'B':
 case 'b':return 11;
 case 'C':
 case 'c':return 12;
 case 'D':
 case 'd':return 13;
 case 'E':
 case 'e':return 14;
 case 'F':
 case 'f':return 15;
 }
 return 0;
}

int pow(int base,int exp){
 for(int i=0;i<exp;++i){
  base*=base;
 }
 return base;
}


int hexa2dec(CString input){
 int forw,back,len=input.GetLength();
 int ret=0;

 for(forw=0,back=len-1;back>=0;
                         ++forw,--back){

  ret+=pow(16,forw) *
           getNumFromChar(input[back]);

 } //end for loop

 return ret;
}


I know this is longer than your current solution, but it will work.

Good Luck!
0
 
nietodCommented:
The bet bet is probalby to do the conversion manually,

int HexStr2Bin(const char *S)
{
   int i = 0;

   while (isspace(*S)) // While in leading spaces.
        ++S; // Skip leading spaces.
   if (*S == '0') // If there is a leading 0.
   {
       ++S; // Skip leading 0.
        if (*S = 'x' || *S = 'X") // If this is a leading 0x, then
           ++S; // Skip the X.
    }
    while (char c = *s++)
    {
       if (!isxdigit(c)) // If not a hex digit, then
           break; // Stop converting.
       i *= 16; // make "room" for new digit.
       if (isdigit(c)) // If this is a digit, then
       {
           i += c - '0'; // add on digit.
       }
        else
       {
          c =  toupper(c);
          i += c - 'A';
       }
    }  
    return i;
}


Let me know if you havne any questions.
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
nietodCommented:
tvanceplus, you might want to look at the code I wrote.  Its a lot more efficient, and a bit more flexible too.
0
 
javigil1Author Commented:
Im afraid your code doesnt work. If I write 0xA11, it translates 11, so it doesnt begin to translate until it finds a number, and it doesnt translate the first characters (no-numbers) anyway.
For instance, 0xaaeca isnt translated at all.
0
 
javigil1Author Commented:
nietod, my last comment wasnt accurate: 0xaaeca is translated, but bad translated.

Tvanceplus, check your code.
Your programm converts 1(hexa) to 16(decimal)!!
0
 
javigil1Author Commented:
Adjusted points from 50 to 60
0
 
nietodCommented:
There were two little mistakes.  The compiler should have reported 1.  The line

     if (*S = 'x' || *S = 'X")

shoiuld be

     if (*S == 'x' || *S == 'X')

and

         i += c - 'A';

should be

         i += c - 'A' + 10;

(Which is the REAL problem).

Note that the procedure is pretty flexible.  The "0x" is optional as are leadig whitespace characters.
0
 
javigil1Author Commented:
Adjusted points from 60 to 70
0

Featured Post

Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

  • 4
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now