??? 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 } } |