首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打印char array[]的十六进制表示形式

打印char array[]的十六进制表示形式
EN

Stack Overflow用户
提问于 2012-04-29 21:01:10
回答 4查看 62.2K关注 0票数 13

我有一个由8个字节组成的数组,我试图打印出十六进制符号。使用printf("%x", array),我可以获取第一个字节并打印出来,但我得到的是"0xffffff9b"或类似的东西。有没有办法不用“f”来得到符号呢?

我想打印出每一个元素,看上去如下:

0x9a, 0x43, 0x0D

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-29 21:15:21

这是:

代码语言:javascript
运行
复制
printf("%x", array);

将很可能以十六进制格式打印数组第一个元素的地址。我说“最有可能”是因为试图打印一个地址的行为,就像它是一个unsigned int一样,是没有定义的。如果你真的想打印地址,正确的方法是:

代码语言:javascript
运行
复制
printf("%p", (void*)array);

(在大多数上下文中,数组表达式被隐式转换为(“衰变”为)指向数组的第一个元素的指针)。

如果要打印数组的每个元素,则必须显式地打印。"%s"格式接受指向字符串第一个字符的指针,并告诉printf遍历字符串,打印每个字符。在十六进制中没有这样的格式,所以你必须自己去做。

例如,考虑到:

代码语言:javascript
运行
复制
unsigned char arr[8];

您可以像这样打印元素5:

代码语言:javascript
运行
复制
printf("0x%x", arr[5]);

或者,如果你想要一个前导零:

代码语言:javascript
运行
复制
printf("0x%02x", arr[5]);

"%x"格式需要一个unsigned int参数,并且您要传递的unsigned char值被隐式地提升到unsigned int,所以这是类型正确的。您可以使用"%x"通过小写的a通过f打印十六进制数字,对于大写则可以使用"%X" (在您的示例中使用这两种数字)。

(请注意,如果字节是8位的话,"0x%02x"格式工作得最好;这不是保证的,但几乎可以肯定,在您可能使用的任何系统上都是如此。)

我将让您编写适当的循环,并决定如何分隔输出。

票数 19
EN

Stack Overflow用户

发布于 2014-06-12 16:42:31

这就是我所做的,使用函数稍微简单一些,我使用它来调试和记录内存。

代码语言:javascript
运行
复制
void print_hex_memory(void *mem) {
  int i;
  unsigned char *p = (unsigned char *)mem;
  for (i=0;i<128;i++) {
    printf("0x%02x ", p[i]);
    if ((i%16==0) && i)
      printf("\n");
  }
  printf("\n");
}
票数 8
EN

Stack Overflow用户

发布于 2019-04-10 09:12:47

用十六进制打印字符串:

代码语言:javascript
运行
复制
void print_hex(const char *string)
{
        unsigned char *p = (unsigned char *) string;

        for (int i=0; i < strlen(string); ++i) {
                if (! (i % 16) && i)
                        printf("\n");

                printf("0x%02x ", p[i]);
        }
        printf("\n\n");
}

char *umlauts = "1 ä ö ü  Ä Ö Ü  é É  ß € 2";

print_hex(umlauts);

0x31 0x20 0xc3 0xa4 0x20 0xc3 0xb6 0x20 0xc3 0xbc 0x20 0x20 0xc3 0x84
0x20 0xc3 0x96 0x20 0xc3 0x9c 0x20 0x20 0xc3 0xa9 0x20 0xc3 0x89 0x20
0x20 0xc3 0x9f 0x20 0xe2 0x82 0xac 0x20 0x32
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10375932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档