今天在处理MAC地址时,遇到之前没有注意的一个问题,特此记录。
在需要字符串格式化输出的时候自然而然的想到了Format函数,MAC地址需要以两位宽度十六进制形式输出,所以我就直接写了%x ,但是在实际输出时遇到一个错误输出格式变成了:·"fffffff0",应该是f0啊.
首先确定自己的程序没有写错,然后简单分析下,只要是0xf*这种就会变成上述的情况,,很明显应该是进位或者符号位问题。
google了下,找到篇博客介绍printf,摘录里面的一段:
究其原因,%x 是 unsigned int 或 int 型输出 ,所以 printf("%x", a) 在执行时将自动将 a 类型提升(char 将提升至 int;unsigned char 将提升至 unsigned int), 注意到 char 是 signed(有符号的),如果这时 a 是负数 ,在提升的时候前面将会补1 ,即象反例中的 0xf1 => 0xfffffff1;而unsigned char 在提升的时候只会补0。”
所以解决方法也就明确了:
str1.Format("%02x", (unsigned char)mac[3]);
str2.Format("%02hhx", mac[3]);
str3.Format("%02x", (mac[3] & 0xff));
上面代表了三种方法:
第一行是进行强制转换。
第二行是进行精确打印格式
第三行是强制变为1byte