如何以特定方式打印十六进制?

时间:2014-02-11 09:30:25

标签: c printf hex

在下面的代码中,我将mac地址存储在 char数组

但即使我将它存储在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:%x",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]);
        for( i = 0; i < 6;i++)
        printf("%x\n",a[i]);
}

我需要输出以下列方式:

aa

bb

cc

dd

ee

ff

当前的printf语句是

printf("%x\n",a[i]);

即使我将ffffffaa存储在char数组中,我如何获得所需的输出以及为什么printf语句打印aa

2 个答案:

答案 0 :(得分:4)

您正在使用%x,期望参数为unsigned int *,但您只是传递char *。这很危险,因为sscanf() 执行int大小的写入,可能在分配给变量的空间之外写入。

sscanf()的转化说明符更改为%hhx,即unsigned char。然后更改打印以匹配。当然,还要制作a数组unsigned char

同时检查以确保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]);
}

答案 1 :(得分:3)

确保将您的a数组视为无符号字符,即

unsigned char a[6];

printf("%x\n",a[i]);

表达式a[i]产生char。但是,标准does not specifychar是签名还是未签名。在您的情况下,编译器显然将其视为签名类型。

由于在Mac地址的所有字节中设置了最高有效位(每个字节大于或等于0x80),a[i]被视为负值,因此printf生成十六进制表示负值。