tags:

views:

410

answers:

3

Hi All,

Can anyone suggest means of converting a byte array to ASCII in C? Or converting byte array to hex and then to ASCII?

[04/02][Edited]: To rephrase it, I wish to convert bytes to hex and store the converted hex values in a data structure. How should go about it?

Regards, darkie

+3  A: 

Well, if you interpret an integer as a char in C, you'll get that ASCII character, as long as it's in range.

int i = 97;
char c = i;

printf("The character of %d is %c\n", i, c);

Prints:

The character of 97 is a

Note that no error checking is done - I assume 0 <= i < 128 (ASCII range).

Otherwise, an array of byte values can be directly interpreted as an ASCII string:

char bytes[] = {97, 98, 99, 100, 101, 0};

printf("The string: %s\n", bytes);

Prints:

The string: abcde

Note the last byte: 0, it's required to terminate the string properly. You can use bytes as any other C string, copy from it, append it to other strings, traverse it, print it, etc.

Eli Bendersky
The integer does not have to be `0 <= i < 128` or (`32 <= i < 128` for printable chars). If you convert an integer to a character, the integer is truncated to the 8 LSBs (least significant bits). Only those have to be in the range. E.g. `i = 1121` gives the same result as `i = 97` (`1121 = 1024 + 97`)
Felix Kling
@Felix: true, but then it doesn't make much sense since you get the modulo 256 of the `int`, which is unlikely to be the desire of the programmer.
Eli Bendersky
Nitpick: `'a'` may or may not be 97 in C. On most computers today, it is, but the C standard doesn't guarantee this. To do this portably, one has to make a lookup table. Of course, `'a' == 97` is true on most of the systems today.
Alok
Hi, I meant how I can convert bytes to ASCII and store those values, maybe in an array?
darkie15
@darkie15: I don't understand what you mean by that. Care to elaborate (or maybe update the question with an example)??
Eli Bendersky
Okie ... Now hex form can be achieved by using %x format. But this is only for printing .. I want to store that hex form, say in a array .. so i can use it later for more processing.
darkie15
@darkie15: how about `sprintf` (or `snprintf` then?
Eli Bendersky
A: 

Char.s and Int.s are stored in binary in C. And can generally be used in place of each other when working in the ASCII range.

int i = 0x61;
char x = i;

fprintf( stdout, "%c", x );

that should print 'a' to the screen.

Mimisbrunnr
Do you want to say that characters are integers?
Felix Kling
Actually no I don't because that is wrong, they are not. They are generally of different size (byte versus word) however you can treat characters as if they were integers and vice versa.
Mimisbrunnr
+1  A: 

First of all you should take some more care on the formulation of your questions. It is hard to say what you really want to hear. I think you have some binary blob and want it in a human readable form, e.g. to dump it on the screen for debugging. (I know I'm probably misinterpreting you here).

You can use snprintf(buf, sizeof(buf), "%.2x", byte_array[i]) for example to convert a single byte in to the hexadecimal ASCII representation. Here is a function to dump a whole memory region on the screen:


void
hexdump(const void *data, int size)
{
    const unsigned char *byte = data;

    while (size > 0)
    {
        size--;
        printf("%.2x ", *byte);
        byte++;
    }
}
quinmars