C 如何以特定方式打印十六进制?
在下面的代码中,我将mac地址存储在字符数组中 但即使我将其存储在char变量中,在打印时,它的打印方式如下:C 如何以特定方式打印十六进制?,c,printf,hex,C,Printf,Hex,在下面的代码中,我将mac地址存储在字符数组中 但即使我将其存储在char变量中,在打印时,它的打印方式如下: ffffffbb ffffffcc ffffffdd ffffffee ffffffff 代码如下: #include<stdio.h> int main() { char *mac = "aa:bb:cc:dd:ee:ff"; char a[6];int i; sscanf(mac,"%x:%x:%x:%x:%x:
ffffffbb
ffffffcc
ffffffdd
ffffffee
ffffffff
代码如下:
#include<stdio.h>
int main()
{
char *mac = "aa:bb:cc:dd:ee:ff";
char a[6];int i;
sscanf(mac,"%x:%x:%x:%x:%x:%x",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]);
for( i = 0; i < 6;i++)
printf("%x\n",a[i]);
}
当前的printf语句是
printf("%x\n",a[i]);
如何获得所需的输出?为什么即使我将
aa
存储在字符数组中,printf语句仍在打印ffffff aa
unsigned char a[6];
在
表达式a[i]
产生一个char
。但是,char
是有符号还是无符号的标准。在您的例子中,编译器显然将其视为有符号类型
由于Mac地址的所有字节中都设置了最高有效位(每个字节大于或等于0x80),
a[i]
被视为负值,因此printf
生成负值的十六进制表示形式。确保将a
数组视为无符号字符,即
unsigned char a[6];
在
表达式a[i]
产生一个char
。但是,char
是有符号还是无符号的标准。在您的例子中,编译器显然将其视为有符号类型
由于Mac地址的所有字节中都设置了最高有效位(每个字节大于或等于0x80),
a[i]
被视为负值,因此printf
生成负值的十六进制表示。您使用的是%x
,它期望参数是无符号int*
,但您只是传递char*
。这是危险的,因为sscanf()
将进行int
大小的写入,可能在分配给变量的空间之外进行写入
将sscanf()
的转换说明符更改为%hhx
,这意味着无符号字符
。然后将打印更改为匹配。当然,还要使成为一个
数组无符号字符
还要检查以确保sscanf()
成功:
unsigned char a[6];
if(sscanf(mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
a, a + 1, a + 2, a + 3, a + 4, a + 5) == 6)
{
printf("daddy MAC is %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
a[0], a[1], a[2], a[3], a[4], a[5]);
}
您使用的是
%x
,它期望参数是无符号int*
,但您只是传递字符*
。这是危险的,因为sscanf()
将进行int
大小的写入,可能在分配给变量的空间之外进行写入
将sscanf()
的转换说明符更改为%hhx
,这意味着无符号字符
。然后将打印更改为匹配。当然,还要使成为一个
数组无符号字符
还要检查以确保sscanf()
成功:
unsigned char a[6];
if(sscanf(mac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
a, a + 1, a + 2, a + 3, a + 4, a + 5) == 6)
{
printf("daddy MAC is %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
a[0], a[1], a[2], a[3], a[4], a[5]);
}
printf(“%hhx\n”,a[i])代码>printf(“%hhx\n”,a[i])代码>嗯。。你能解释一下为什么会有不同吗?@weaselox我刚刚扩展了我的答案,这有帮助吗?我真的认为这也应该解决sscanf()
问题。@unwind我觉得你的答案很好地解决了sscanf
调用的问题,我想我没有任何补充。但是,sscanf
的不正确使用并不是OP给出的预期和观察到的输出出现偏差的原因(如果a
像char a[]={0xaa,0xbb,0xcc…};
那样初始化,您也会遇到同样的问题)。所以我的回答集中在这一点上。@FrerichRaabe好的,很好。谢谢。:)陛下你能解释一下为什么会有不同吗?@weaselox我刚刚扩展了我的答案,这有帮助吗?我真的认为这也应该解决sscanf()
问题。@unwind我觉得你的答案很好地解决了sscanf
调用的问题,我想我没有任何补充。但是,sscanf
的不正确使用并不是OP给出的预期和观察到的输出出现偏差的原因(如果a
像char a[]={0xaa,0xbb,0xcc…};
那样初始化,您也会遇到同样的问题)。所以我的回答集中在这一点上。@FrerichRaabe好的,很好。谢谢。:)