Solved

Hexadecimal Data

Posted on 2000-04-14
9
214 Views
Last Modified: 2010-04-10
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
Comment
Question by:javigil1
  • 4
  • 4
9 Comments
 
LVL 22

Accepted Solution

by:
nietod earned 70 total points
ID: 2716153
The string must begin with "0x" or "0X" to be considered a HEX number string  (it can have whitespace before the 0.)

continues.
0
 
LVL 1

Expert Comment

by:tvanceplus
ID: 2716184
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
 
LVL 22

Expert Comment

by:nietod
ID: 2716208
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
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 
LVL 22

Expert Comment

by:nietod
ID: 2716235
tvanceplus, you might want to look at the code I wrote.  Its a lot more efficient, and a bit more flexible too.
0
 

Author Comment

by:javigil1
ID: 2716331
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
 

Author Comment

by:javigil1
ID: 2716355
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
 

Author Comment

by:javigil1
ID: 2716408
Adjusted points from 50 to 60
0
 
LVL 22

Expert Comment

by:nietod
ID: 2716653
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
 

Author Comment

by:javigil1
ID: 2716823
Adjusted points from 60 to 70
0

Featured Post

DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

810 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question