在C语言中将十六进制转换为字符串?

9

你好,我正在使用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个元素。


请明确,您希望第二个printf()打印什么内容。 - James Curran
inet_ntoa() - Ryan Haining
使用snprintf将内容打印到缓冲区,然后再进行打印?同时记得添加字符串终止的0字节。 - hyde
看了一下回答,我觉得我表达不够清楚,抱歉。实际上,我有一个数组,它读取的是字符型的“readingreg”,但其中包含十六进制的值。我想将其值转换为字符串。例如:readingreg[0] = 4a,4a 是十六进制值,有人能帮我创建一个新数组吗?它应该是这样的:newArray[0] = 4a;newArray[1] = aa;以此类推,其中 4a 和 aa 将是字符串,而不是十六进制。 - Dale Reed
2个回答

10

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];

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

这会导致一个错误。pointer targets in passing argument 1 of ‘sprintf’ differ in signedness [-Werror=pointer-sign]。可能这只是一个警告,但我开启了Werror - Duck Dodgers
你确定吗?这段代码没有指针,并且我使用严格的警告编译(-Wpedantic -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wconversion -Wshadow -Wcast-qual -Wnested-externs),gcc在不发出任何警告的情况下编译了这段代码。Godbolt也是如此:https://godbolt.org/z/9h7rEP,没有警告。你用的是哪个编译器? - David Ranieri
@DuckDodgers,现在我明白你不是原帖作者,请看上面的评论。我也尝试过打开 -Wpointer-sign 选项但没有警告。无论如何,如果你的编译器抱怨签名问题,请将 char temp[4]; 改为 unsigned char temp[4]; ,并将 printf("This is element 0: %s\n", (char *)temp); 强制类型转换。 - David Ranieri
如果我将temp的数据类型更改为char,那么就不会出现任何错误。我在Debian 10上使用gcc8.3.0。感谢您的及时更新。unsigned char数据类型仅对存储字节数组的变量很重要,使用char可能会导致溢出。 - Duck Dodgers
不客气,我在Debian 10上有gcc8.3.0 - 这很奇怪,我也在Debian 10上,没有收到任何警告,在我的笔记本电脑上使用Ubuntu 18.04也是如此。 - David Ranieri
@DavidRanieri 对不起,我误读了代码的意图。我会很快删除我的评论,以保持整洁。 - Chnossos

2

如果您的计算机是大端字节序,您可以执行以下操作:

char str[9];

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

如果您的计算机是小端字节序,您需要交换字节顺序:

char str[9];
uint32_t host;

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

如果可移植性是一个问题,无论您的字节序如何,您都应该使用方法二。 我得到以下输出:
printf("0x%s\n", str);

0x4aaaaaa0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接