# Thread: Hex digits stored in char array.

1. ## 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.

2. 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. 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```

4. Thanks for the help it worked.

5. Originally Posted by Kevinmun
Thanks for the help it worked.
The important part is whether or not you understand it.

6. 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. 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. 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.

9. 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.