Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何以特定方式打印十六进制?_C_Printf_Hex - Fatal编程技术网

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

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:

在下面的代码中,我将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:%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好的,很好。谢谢。:)