2014-09-02 98 views
6

你好我正在使用digi动态c。我想在将它转换为字符串在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端口发送readreg数组,我需要它作为字符串。我似乎无法将其转换为字符串。谢谢你的帮助。 另外,如果有人可以告诉我如何一次完成每个元素而不是整个数组,那么这将很好,因为只有4个元素。

+0

请澄清一下,究竟是什么给你希望打印第二个printf()。 – 2014-09-02 19:42:28

+0

[INET_NTOA()](http://linux.die.net/man/3/inet_ntoa) – 2014-09-02 19:52:20

+0

使用'snprintf'打印到缓冲区,然后打印?还要记住字符串终止0字节。 – hyde 2014-09-02 19:52:50

回答

6

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; 
} 
+0

这工作。谢谢! – 2014-09-03 16:01:35

+0

不客气 – 2014-09-04 07:24:34

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

相关问题