sscanf:sscanf在PowerPC下的小技巧

#include <stdio.h>

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 <stdio.h>

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进制数。这样问题,就解决了。
Tags:  sscanf返回值 sscanf函数 sscanf用法 sscanf

延伸阅读

最新评论

发表评论