Преобразуване на шестнадесетичен в низ в C?

Здравейте, използвам digi dynamic c. Опитвам се да преобразувам това в низ

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

В момента, когато правя printf изрази, трябва да е така:

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

Но искам това в низ, за ​​да мога да използвам израз printf като този

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

По същество изпращам масива readingreg през TCP/IP порт, за който трябва да го имам като низ. Изглежда не мога да го преобразувам в низ. Благодаря за вашата помощ. Също така, ако някой може да ми каже как да направя всеки елемент наведнъж, а не цял масив, това би било добре, тъй като ще има само 4 елемента.


person Dale Reed    schedule 02.09.2014    source източник
comment
Моля, изяснете какво точно искате да отпечата вторият printf().   -  person James Curran    schedule 02.09.2014
comment
inet_ntoa()   -  person Ryan Haining    schedule 02.09.2014
comment
Използвайте snprintf за отпечатване в буфер, след което отпечатайте това? Също така запомнете низа, завършващ с 0 байта.   -  person hyde    schedule 02.09.2014
comment
Гледайки отговорите, не мисля, че бях ясен, съжалявам. Така че по същество имам масив, който е readingreg (char), но има шестнадесетични стойности. Искам стойностите му да са низови. Например: readingreg[0] = 4a, 4a е шестнадесетична стойност може ли някой да ми помогне да направя нов масив и той ще изглежда така: newArray[0] = 4a; нов масив[1] = aa; и така нататък, където 4a и aa ще бъдат низове, а не шестнадесетични.   -  person Dale Reed    schedule 03.09.2014


Отговори (2)


0xaa препълва, когато обикновеният 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;
}
person David Ranieri    schedule 02.09.2014
comment
Това дава грешка. pointer targets in passing argument 1 of ‘sprintf’ differ in signedness [-Werror=pointer-sign]. Вероятно е предупреждение, но имам включен Werror. - person Duck Dodgers; 28.01.2021
comment
Сигурен ли си? в този код няма включени указатели и аз компилирам със стриктни предупреждения (-Wpedantic -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wconversion -Wshadow -Wcast-qual -Wnested-externs) и gcc компилира тихо без предупреждения тази част от кода. Същото за godbolt: godbolt.org/z/9h7rEP няма предупреждения. Кой компилатор използвате? - person David Ranieri; 28.01.2021
comment
@DuckDodgers, сега виждам, че вие ​​не сте OP, вижте коментара по-горе, аз също се опитах с включен флаг -Wpointer-sign без предупреждения, така или иначе, ако вашият компилатор се оплаква от подписаност, превключете от char temp[4]; на unsigned char temp[4]; и прехвърлете printf("This is element 0: %s\n", (char *)temp); - person David Ranieri; 28.01.2021
comment
Ако променя типа данни от temp на char, тогава не получавам никакви грешки. Имам gcc8.3.0 на Debian 10. Благодаря ви за бързата актуализация. Типът данни unsigned char е важен само за променливата, съхраняваща байтовия масив, където използването на char може да причини препълване. - person Duck Dodgers; 28.01.2021
comment
Добре дошли, имам gcc8.3.0 на Debian 10 - това е странно, аз също съм на Debian 10 и не получавам никакво предупреждение, същото е и на моя лаптоп с Ubuntu 18.04 - person David Ranieri; 28.01.2021
comment
@DavidRanieri Лошото ми е, че разбрах погрешно намерението на кода. Скоро ще изтрия коментарите си, за да запазя това чисто. - person Chnossos; 06.04.2021

Ако машината ви е big endian, можете да направите следното:

char str[9];

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

Ако вашата машина е little endian, ще трябва да размените реда на байтовете:

char str[9];
uint32_t host;

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

Ако преносимостта е проблем, трябва да използвате метод две, независимо от вашето endianness.

Получавам следния изход:

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

0x4aaaaaa0

person Fiddling Bits    schedule 02.09.2014