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

Posted

技术标签:

【中文标题】在C中将十六进制转换为字符串?【英文标题】:Converting hex to string in C? 【发布时间】:2014-10-27 03:57:18 【问题描述】:

您好,我正在使用 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]);

我本质上是通过 TCP/IP 端口发送 readingreg 数组,为此我需要将它作为字符串。我似乎无法将其转换为字符串。谢谢你的帮助。 另外,如果有人可以告诉我如何一次处理每个元素而不是整个数组,那很好,因为只有 4 个元素。

【问题讨论】:

请澄清一下,您希望第二个 printf() 打印什么。 inet_ntoa() 使用snprintf 打印到缓冲区,然后打印?还要记住以 0 字节结尾的字符串。 看答案我不认为我很清楚,对不起。所以本质上我有一个正在读取reg(char)但具有十六进制值的数组。我希望它的值是字符串。例如: readingreg[0] = 4a, 4a 是十六进制值 有人可以帮我制作一个新数组,它看起来像: newArray[0] = 4a;新数组[1] = aa;依此类推,其中 4a 和 aa 将是字符串而不是十六进制。 【参考方案1】:

当普通char被签名时0xaa溢出,使用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;

【讨论】:

这给出了一个错误。 pointer targets in passing argument 1 of ‘sprintf’ differ in signedness [-Werror=pointer-sign]。可能这是一个警告,但我打开了Werror 你确定吗?此代码中不涉及指针,我正在编译严格警告(-Wpedantic -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wconversion -Wshadow -Wcast-qual -Wnested-externs)和gcc 静默编译而没有警告这段代码。 Godbolt 也一样:godbolt.org/z/9h7rEP 没有警告。你用的是哪个编译器? @DuckDodgers,现在我发现您不是 OP,请参阅上面的评论,我还尝试在没有警告的情况下打开 -Wpointer-sign 标志,无论如何,如果您的编译器抱怨签名,请从 @ 切换987654331@ 到 unsigned char temp[4]; 和演员 printf("This is element 0: %s\n", (char *)temp); 如果我将temp 的数据类型更改为char,则不会出现任何错误。我在 Debian 10 上有 gcc8.3.0。感谢您的及时更新。 unsigned char 数据类型仅对存储字节数组的变量很重要,其中使用 char 可能会导致溢出。 不客气,我在 Debian 10 上有 gcc8.3.0 - 这很奇怪,我也在 Debian 10 上,但我没有收到任何警告,我的装有 Ubuntu 18.04 的笔记本电脑【参考方案2】:

如果你的机器是大端的,你可以这样做:

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

如果担心可移植性,则无论您的字节顺序如何,都应使用方法二。

我得到以下输出:

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

0x4aaaaaa0

【讨论】:

以上是关于在C中将十六进制转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在C中将十六进制字符串转换为二进制字符串?

在 C 中将字符转换为二进制

如何在C中将无符号字符数组转换为十六进制字符串

在 C 中将 ascii char[] 转换为十六进制 char[]

如何在 Objective C 中将十六进制数转换为整数和字符串?

在Objective C(可可)中将十六进制数据字符串转换为NSData