Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
05/08/08 06:19
Read: times


 
#154563 - Grossly inefficient!
Responding to: ???'s previous message
Chris Bertrand said:
unsigned char Hex2Ascii(unsigned char HexValue)
{
   switch (HexValue)
   {
    case 0x00: return (HexValue + 0x30); break; // ASCII 0 0x30
    case 0x01: return (HexValue + 0x30); break; // ASCII 1 0x31
    case 0x02: return (HexValue + 0x30); break; // ASCII 2 0x32
    case 0x03: return (HexValue + 0x30); break; // ASCII 3 0x33
    case 0x04: return (HexValue + 0x30); break; // ASCII 4 0x34
    case 0x05: return (HexValue + 0x30); break; // ASCII 5 0x35
    case 0x06: return (HexValue + 0x30); break; // ASCII 6 0x36
    case 0x07: return (HexValue + 0x30); break; // ASCII 7 0x37
    case 0x08: return (HexValue + 0x30); break; // ASCII 8 0x38
    case 0x09: return (HexValue + 0x30); break; // ASCII 9 0x39
    case 0x0A: return (HexValue + 0x37); break; // ASCII A 0x41
    case 0x0B: return (HexValue + 0x37); break; // ASCII B 0x42
    case 0x0C: return (HexValue + 0x37); break; // ASCII C 0x43
    case 0x0D: return (HexValue + 0x37); break; // ASCII D 0x44
    case 0x0E: return (HexValue + 0x37); break; // ASCII E 0x45
    case 0x0F: return (HexValue + 0x37); break; // ASCII F 0x46
//*********************************************
    case 0x10: return (HexValue + 0x21); break; // ASCII 1 0x31
    case 0x20: return (HexValue + 0x12); break; // ASCII 2 0x32
    case 0x30: return (HexValue + 0x03); break; // ASCII 3 0x33
    case 0x40: return (HexValue - 0x0C); break; // ASCII 4 0x34
    case 0x50: return (HexValue - 0x1B); break; // ASCII 5 0x35
    case 0x60: return (HexValue - 0x2A); break; // ASCII 6 0x36
    case 0x70: return (HexValue - 0x39); break; // ASCII 7 0x37
    case 0x80: return (HexValue - 0x48); break; // ASCII 8 0x38
    case 0x90: return (HexValue - 0x57); break; // ASCII 9 0x39
    case 0xA0: return (HexValue - 0x5F); break; // ASCII A 0x41
    case 0xB0: return (HexValue - 0x6E); break; // ASCII B 0x42
    case 0xC0: return (HexValue - 0x7D); break; // ASCII C 0x43
    case 0xD0: return (HexValue - 0x8C); break; // ASCII D 0x44
    case 0xE0: return (HexValue - 0x9B); break; // ASCII E 0x45
    case 0xF0: return (HexValue - 0xAA); break; // ASCII F 0x46   
    default: break;
    }

}

As Neil said, that's a huge amount of code for such a simple operation!

For a start, because you have one case for each possible value, there's no point computing the return value - you might as well just return it literally.

But, really, Brett has already given you the simple solution - all you need to add is coping with the value for conversion being in either the high or low byte; eg,

unsigned char Hex2Ascii(unsigned char HexValue)
{
   // First, ensure that the value to be converted  is in the low nibble
   if( HexValue > 0x0F )
   {
      HexValue >>= 4; // Shift the value down from the top nibble
   }


   // Now, convert the low nibble
   if (HexValue <= 0x09)        // For values 0x00 - 0x09
   {
      return(HexValue + '0');   // Return the ascii code for the digits
   }
   else                         // For values 0x0A - 0x0F 
   {
      return((HexValue-10) + 'A');   // Return the upper case ascii codes
   }
}


List of 35 messages in thread
TopicAuthorDate
Problem with the toascii() w/ clarification            01/01/70 00:00      
   toascii not what you want            01/01/70 00:00      
      Ah yes.....makes sense            01/01/70 00:00      
         C does know ASCII            01/01/70 00:00      
            the final result:            01/01/70 00:00      
               That is a LOT of code            01/01/70 00:00      
                  It won't compile in its state because...            01/01/70 00:00      
               Grossly inefficient!            01/01/70 00:00      
                  A small trick            01/01/70 00:00      
                     small trick is cool.....            01/01/70 00:00      
                        Same as Neil's            01/01/70 00:00      
                           Ah makes sense.....            01/01/70 00:00      
                              You can still do better            01/01/70 00:00      
                                 LOL....Russ.......LOL            01/01/70 00:00      
                                    sprintf()            01/01/70 00:00      
                                       I had you at <>            01/01/70 00:00      
                                          So why not sprintf()?            01/01/70 00:00      
                                             You are right......I did say that            01/01/70 00:00      
                        How the small trick works            01/01/70 00:00      
                           Is it worth it?            01/01/70 00:00      
                              Same assembly generated for me            01/01/70 00:00      
                           You said index.....click click....very nice            01/01/70 00:00      
                              fast (sic?) lookup table            01/01/70 00:00      
                                 Faster? Probably not.            01/01/70 00:00      
               What's in a name?            01/01/70 00:00      
                  true.....but at this point.......            01/01/70 00:00      
                     Tricks and treats            01/01/70 00:00      
                     there is no time lost by doing it right            01/01/70 00:00      
                        You guys are completely right,            01/01/70 00:00      
                           the very simple way to (almost) do it right            01/01/70 00:00      
                           For the sake of learning            01/01/70 00:00      
                              Good point            01/01/70 00:00      
   UART doesn't know ASCII            01/01/70 00:00      
      Good point....but            01/01/70 00:00      
   Unhelpful documentation            01/01/70 00:00      

Back to Subject List