我有一个8字节的数组,我正在尝试打印出十六进制表示法。使用printf("%x", array)
我可以得到第一个字节并将其打印出来,但我得到"0xffffff9b"
或类似的东西。有没有办法在没有“f”的情况下获得符号?
我想打印出类似的每个元素:
0x9a, 0x43, 0x0D
等
答案 0 :(得分:16)
此:
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"
格式效果最好;这不能保证,但在您可能使用的任何系统上几乎都是这样。)
我会留给你编写适当的循环并决定如何分隔输出。
答案 1 :(得分:4)
这就是我所做的,它使用一个函数稍微容易一些,我用它来调试和记录内存。
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");
}
答案 2 :(得分:0)
以十六进制打印字符串:
UILabel
答案 3 :(得分:0)
我发现这正是我所需要的,因为我只需要原始十六进制输出。 归功于安迪。
享受吧!
char *print_hex_memory(unsigned char *p) {
int i;
char tmp[3];
char *output = malloc(strlen(p)*2+1);
memset(output, 0, sizeof(output));
for (i=0;i<strlen(p);i++) {
sprintf(tmp, "%02x", p[i]);
strcat(output, tmp);
}
return output;
}