在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 中将 ascii char[] 转换为十六进制 char[]