Converting hex to string in C?
Asked Answered
B

2

9

Hello I am using digi dynamic c. I am trying to convert this in to string

char readingreg[4];
readingreg[0] = 4a;
readingreg[1] = aa;
readingreg[2] = aa;
readingreg[3] = a0;

Currently when I do printf statements it has to be like this:

printf("This is element 0: %x\n", readingreg[0]);

But I want this in string so I can use printf statement like this

  printf("This is element 0: %s\n", readingreg[0]);

I am essentialy sending the readingreg array over TCP/IP Port, for which I need to have it as string. I cant seem to be able to convert it into string. Thanks for your help. Also if someone can tell me how to do each element at a time rather than whole array, that would be fine to since there will only be 4 elements.

Baumann answered 2/9, 2014 at 19:30 Comment(4)
Please clarify, what exactly to you want the second printf() to print.Viator
inet_ntoa()Wilmoth
Use snprintf to print to a buffer, then print that? Also remember the string terminating 0 byte.Murray
Looking at answers i dont think i was clear, sorry. So essentialy i have an array which is readingreg (char) but has hex values. I want its values to be string. For example: readingreg[0] = 4a, 4a is hex value can someone help me in making a new array and it would look like: newArray[0] = 4a; newArray[1] = aa; and so on where 4a and aa will be strings rather than hex.Baumann
B
10

0xaa overflows when plain char is signed, use unsigned char:

#include <stdio.h>

int main(void)
{
    unsigned char readingreg[4];
    readingreg[0] = 0x4a;
    readingreg[1] = 0xaa;
    readingreg[2] = 0xaa;
    readingreg[3] = 0xa0;
    char temp[4];

    snprintf(temp, sizeof temp, "%x", readingreg[0]);
    printf("This is element 0: %s\n", temp);
    return 0;
}
Biographer answered 2/9, 2014 at 19:56 Comment(5)
This gives an error. pointer targets in passing argument 1 of ‘sprintf’ differ in signedness [-Werror=pointer-sign]. Probably it is a warning but I have Werror on.Sunroom
Are you sure? there are not pointers involved in this code and I'm compiling with stricts warnings (-Wpedantic -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wconversion -Wshadow -Wcast-qual -Wnested-externs) and gcc compiles silently without warnings this piece of code. Same for godbolt: godbolt.org/z/9h7rEP no warnings. Which compiler are you using?Biographer
If I change the data type of temp to char, then I do not get any errors. I have gcc8.3.0 on Debian 10. Thank you for the prompt update. The unsigned char data type is important only for the variable storing the byte-array, where using a char could cause an overflow.Sunroom
You are welcome, I have gcc8.3.0 on Debian 10 - that's odd, I'm also on Debian 10 and I don't receive any warning, same on my laptop with Ubuntu 18.04Biographer
@DavidRanieri My bad I misread the intent of the code. I'll delete my comments soon to keep this clean.Unstring
M
2

If your machine is big endian, you can do the following:

char str[9];

sprintf(str, "%x", *(uint32_t *)readingreg);

If your machine is little endian you'll have to swap the byte order:

char str[9];
uint32_t host;

host = htonl(*(uint32_t *)readingreg);
sprintf(str, "%x", host);

If portability is a concern, you should use method two regardless of your endianness.

I get the following output:

printf("0x%s\n", str);

0x4aaaaaa0

Marketplace answered 2/9, 2014 at 19:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.