我有一个由8个字节组成的数组,我试图打印出十六进制符号。使用printf("%x", array)
,我可以获取第一个字节并打印出来,但我得到的是"0xffffff9b"
或类似的东西。有没有办法不用“f”来得到符号呢?
我想打印出每一个元素,看上去如下:
0x9a, 0x43, 0x0D
等
发布于 2012-04-29 21:15:21
这是:
printf("%x", array);
将很可能以十六进制格式打印数组第一个元素的地址。我说“最有可能”是因为试图打印一个地址的行为,就像它是一个unsigned int
一样,是没有定义的。如果你真的想打印地址,正确的方法是:
printf("%p", (void*)array);
(在大多数上下文中,数组表达式被隐式转换为(“衰变”为)指向数组的第一个元素的指针)。
如果要打印数组的每个元素,则必须显式地打印。"%s"
格式接受指向字符串第一个字符的指针,并告诉printf
遍历字符串,打印每个字符。在十六进制中没有这样的格式,所以你必须自己去做。
例如,考虑到:
unsigned char arr[8];
您可以像这样打印元素5:
printf("0x%x", arr[5]);
或者,如果你想要一个前导零:
printf("0x%02x", arr[5]);
"%x"
格式需要一个unsigned int
参数,并且您要传递的unsigned char
值被隐式地提升到unsigned int
,所以这是类型正确的。您可以使用"%x"
通过小写的a
通过f
打印十六进制数字,对于大写则可以使用"%X"
(在您的示例中使用这两种数字)。
(请注意,如果字节是8位的话,"0x%02x"
格式工作得最好;这不是保证的,但几乎可以肯定,在您可能使用的任何系统上都是如此。)
我将让您编写适当的循环,并决定如何分隔输出。
发布于 2014-06-12 16:42:31
这就是我所做的,使用函数稍微简单一些,我使用它来调试和记录内存。
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");
}
发布于 2019-04-10 09:12:47
用十六进制打印字符串:
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
https://stackoverflow.com/questions/10375932
复制相似问题