Преобразование hex в string в C?

Привет я использую Digi dynamic c. Я пытаюсь преобразовать это в string

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

в настоящее время, когда я делаю printf утверждения это должно быть так:

printf("This is element 0: %xn", readingreg[0]);

но я хочу это в строке, чтобы я мог использовать printf показания

  printf("This is element 0: %sn", readingreg[0]);

Я по существу отправляю массив readingreg через порт TCP/IP, для которого мне нужно иметь его как строку. Кажется, я не могу преобразовать его в строку. Спасибо за помощь. Также если кто-то может сказать мне, как сделать каждый элемент за раз, а не весь массив, что было бы хорошо, так как будет только 4 элемента.

2 ответов


0xaa переполняется, когда plain char подписан, используйте 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];

    sprintf(temp, "%x", readingreg[0]);
    printf("This is element 0: %s\n", temp);
    return 0;
}

Если ваша машина большая endian, то вы можете сделать следующее:

char str[9];

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

Если ваша машина немного endian, вам придется поменять порядок байтов:

char str[9];
uint32_t host;

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

Если переносимость является проблемой, вы должны использовать метод два независимо от вашей endianness.

Я получаю следующий вывод:

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

0x4aaaaaa0