2009计算机二级C语言:sscanf在PowerPC下的小技巧
分类:计算机等级
|
更新时间:2016-07-07|
来源:中华网考试
#include
typedef unsigned char uint8;
int main()
{
char szMAC[18]; //fa:a0:b0:00:3e:4d
uint8 mac[6];
strcpy(szMAC,"fa:a0:b0:00:3e:4d");
sscanf("%02x:%02x:%02x:%02x:%02x:%02x",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);
return 0;
}
上面这段代码的意思,是想将字符串的MAC转化成数值。在x86平台下,一切都能正常通过。mac数组得到了我们想要的结果。可是到了Power平台下,就郁闷了,mac数组全是0。这是为什么呢?
首先,我们应该了解一下两种CPU的区别。x86属于LITTLE_ENDIAN,而Power属于BIG_ENDIAN。那什么是LITTLE_ENDIAN、BIG_ENDIAN呢?
下面,我来举个例子。一个32位的整型数,如0x12345678,在不同平台下,存放形式:
内存地址 LITTLE_ENDIAN BIG_ENDIAN
0x0000 78 12
0x0001 56 34
0x0002 34 56
0x0003 12 78
然后,就是"02x"了。它指的是一个16进制数。可是占多少位呢?这就要看你的CPU是多少的位了。一般来说,现在的CPU,都是32位。其实,也就是一个整型数占多少位。
在x86(32位)平台下,先将mac[0]填充为"fa",但是"02x"要占用32位,所以它分别又将mac[1]、mac[2]和mac[3]填充为0(0x000000fa)。其实,此时已经属于越界访问了,但程序并不会出错。下面的以此类推。
在Power(32位)平台下,同理。但是要注意的是,它是将高位字节填充到低地址中。所以,这样下去后,整个mac数组就是全0了。
修正程序,如下:
#include
typedef unsigned char uint8;
int main()
{
char szMAC[18]; //fa:a0:b0:00:3e:4d
uint8 mac[6];
strcpy(szMAC,"fa:a0:b0:00:3e:4d");
sscanf("%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);
return 0;
}
"hh"表示转换成一个8位的16进制数。这样问题,就解决了。