Thread: Hex digits stored in char array.

  1. #1
    Registered User
    Join Date
    Nov 2005
    Posts
    9

    Hex digits stored in char array - Question in response to your asnwer

    Hi. Sorry if this has been asked already, tried searching FAQ, and found a similar question, but not what I was looking for. Anyway, I'm trying to take an array with characters that represent hexidecimal digits.. something like "104B" and save it in another char array. However, in this array I will need two hex digits stored in each element. So I have:

    Code:
    typedef char byte;
    byte objectCode[4]; /* stores 4 bytes (8 hex digits) */
    So using "104B" as an example I would need to have
    objectCode[0] = 00010000 /* hex digits 10 in binary */
    objectCode[1] = 01001011 /* hex digits 4b in binary */

    I have no idea is there is a simple way to do this or not, any help would be greatly appreciated. Thanks.
    Last edited by Kevinmun; 11-18-2005 at 03:56 PM.

  2. #2
    Registered User
    Join Date
    Aug 2003
    Posts
    288
    well i did something like that a while ago, although i was in a hurry so my method probably isnt the fastest/most efficient.

    i used a script to generate 0x00 thru 0xff and used a lookup table to convert a string of hex values (e.g. "AA BB CC") to the char array equiv (char cTemp = {0xaa, 0xbb, 0xcc}

    heres the code if itll help any:

    Code:
    /*example usage:
    
    char sBuffer[256];
    unsigned int nLen;
    
    nLen = HexToASCII(sBuffer, "65 66 67");
    
    //sBuffer will contain "ABC", nLen = 3
    */
    unsigned int HexToASCII(unsigned char *buffer, const char *sHex)
    {
    	char sHexTable[256][3] =
    	{
    		"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F",
    		"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F",
    		"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F",
    		"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F",
    		"40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F",
    		"50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F",
    		"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F",
    		"70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F",
    		"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F",
    		"90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F",
    		"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF",
    		"B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF",
    		"C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF",
    		"D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF",
    		"E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF",
    		"F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF"
    	};
    
    	unsigned int n, n1, i;
    	char sTemp[3];
    
    	for (n = 0, n1 = 0; n < strlen(sHex); n += 3)
    	{
    		sTemp[0] = sHex[n];
    		sTemp[1] = sHex[n + 1];
    		sTemp[2] = '\0';
    
    		for (i = 0; i < 256; i++)
    		{
    			if (strcmp(sHexTable[i], sTemp) == 0)
    				buffer[n1++] = i;
    		}
    	}
    
    	return n1;
    }

  3. #3
    Gawking at stupidity
    Join Date
    Jul 2004
    Location
    Oregon, USA
    Posts
    3,218
    First of all, you'll probably want to change your typedef to: typedef unsigned char byte;

    In regard to your question, you'll need to do the conversion manually. I'd do something like this:
    Code:
    itsme@itsme:~/C$ cat hextobin2.c
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    char *hextobin(char hexch)
    {
      static char binstr[5];
      char hexdigits[] = "0123456789ABCDEF";
      char *h;
      int bit;
    
      h = strchr(hexdigits, toupper(hexch));
    
      for(bit = 4;bit >= 1;--bit)
        binstr[4 - bit] = (((h - hexdigits) >> (bit - 1)) & 1) + '0';
      binstr[4] = '\0';
    
      return binstr;
    }
    
    int main(void)
    {
      char hex[5] = "104B";
      char bin[2][9];
    
      strcpy(bin[0], hextobin(hex[0]));
      strcat(bin[0], hextobin(hex[1]));
      strcpy(bin[1], hextobin(hex[2]));
      strcat(bin[1], hextobin(hex[3]));
    
      puts(bin[0]);
      puts(bin[1]);
    
      return 0;
    }
    Code:
    itsme@itsme:~/C$ ./hextobin2
    00010000
    01001011
    If you understand what you're doing, you're not learning anything.

  4. #4
    Registered User
    Join Date
    Nov 2005
    Posts
    9
    Thanks for the help it worked.

  5. #5
    Gawking at stupidity
    Join Date
    Jul 2004
    Location
    Oregon, USA
    Posts
    3,218
    Quote Originally Posted by Kevinmun
    Thanks for the help it worked.
    The important part is whether or not you understand it.
    If you understand what you're doing, you're not learning anything.

  6. #6
    Registered User
    Join Date
    Nov 2005
    Posts
    9
    Quote Originally Posted by itsme86
    The important part is whether or not you understand it.
    But I thought if I understand it then I'm not learning anything. I do understand it though. I wouldn't have thought to do it that way on my own, but I do understand how it works. Thanks.

  7. #7
    Registered User
    Join Date
    Nov 2005
    Posts
    9
    Question in reply to your asnwer. The assignment I'm working on specifies that we are supposed to store 8 hexadecimal digits into an array declared as
    Code:
     char objCode[4];
    You used a 2 dimenional array and saved each binary digit as an element in the array. I would need to literally have 8 binary digits stored in each element of obcCode. Is that even possible. I tried the following:
    Code:
     objCode[0] = 00000100;
    To my surprise it didn't give me an error. But when I tried printing the result as an integer using %d, it printed 64.

  8. #8
    ATH0 quzah's Avatar
    Join Date
    Oct 2001
    Posts
    14,826
    Prefixing numbers with a zero, with regards to integer constants, gives you octal. Write a program to move through the bits of the variable (read the bit shifting FAQ), and if set, place a 1, else a 0.


    Quzah.
    Hope is the first step on the road to disappointment.

  9. #9
    Registered User
    Join Date
    Nov 2005
    Posts
    9
    Quote Originally Posted by quzah
    Prefixing numbers with a zero, with regards to integer constants, gives you octal. Write a program to move through the bits of the variable (read the bit shifting FAQ), and if set, place a 1, else a 0.
    Quzah.
    Too bad it doesn't give me binary because then my problems would be solved. Alright, I'll take a look at the bit shifting facts, thanks for the tip.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Replies: 3
    Last Post: 11-17-2008, 12:36 PM
  2. Replies: 11
    Last Post: 03-24-2006, 11:26 AM
  3. Need help understanding info in a header file
    By hicpics in forum C Programming
    Replies: 8
    Last Post: 12-02-2005, 12:36 PM
  4. fill unsigned char array with hex values
    By luigi40 in forum C Programming
    Replies: 1
    Last Post: 06-25-2005, 05:56 AM
  5. Hi, could someone help me with arrays?
    By goodn in forum C Programming
    Replies: 20
    Last Post: 10-18-2001, 09:48 AM