Solved

Hexadecimal Data

Posted on 2000-04-14
9
211 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
Comment Utility
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
Comment Utility
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
Comment Utility
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
 
LVL 22

Expert Comment

by:nietod
Comment Utility
tvanceplus, you might want to look at the code I wrote.  Its a lot more efficient, and a bit more flexible too.
0
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 

Author Comment

by:javigil1
Comment Utility
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
Comment Utility
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
Comment Utility
Adjusted points from 50 to 60
0
 
LVL 22

Expert Comment

by:nietod
Comment Utility
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
Comment Utility
Adjusted points from 60 to 70
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Often, when implementing a feature, you won't know how certain events should be handled at the point where they occur and you'd rather defer to the user of your function or class. For example, a XML parser will extract a tag from the source code, wh…
  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

772 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

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now