sscanf在PowerPC下的小技巧

sscanf在PowerPC下的小技巧,第1张

sscanf在PowerPC下的小技巧,第2张

# include
typedef unsigned char uint 8;
int main()
{
char szMAC[18];//fa:A0:B0:00:3e:4d
uint 8 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]);
返回0;
}
上面这段代码的意思是将一个字符串的MAC值转换成一个数值。在x86平台下,一切都可以正常通过。Mac阵列得到了我们想要的结果。然而在Power平台下,我郁闷了,mac数组全是0。这是为什么呢?
首先要知道两个CPU的区别。X86属于LITTLE_ENDIAN,Power属于BIG_ENDIAN。什么是小端和大端?
接下来,我举个例子。一个32位的整数,比如0x12345678,以
内存地址little _ endian big _ endian
0x 0000 78 12
0x 0001 56 34
0x 0002 34 56[/br]的形式存储,它指的是一个十六进制数。但是有多少呢?这取决于你的CPU是多少位。一般来说,现在的CPU都是32位的。其实就是一个整数占多少位。
在x86(32位)平台上,mac[0]先用“fa”填充,但“02x”占用了32位,所以分别用0(0x000000fa)填充mac[1]、mac[2]和mac[3]。其实这已经是跨界访问了,只是程序不会出错。以下依此类推。
在Power(32位)平台下,同样如此。但是,需要注意的是,它将高位字节填充到低位地址中。所以,这样下去之后,整个mac数组都是0。
修复程序如下:
# include
typedef unsigned char uint 8;
int main()
{
char szMAC[18];//fa:A0:B0:00:3e:4d
uint 8 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]);
返回0;
}
“hh”表示转换为8位十六进制数。这样,问题就解决了。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » sscanf在PowerPC下的小技巧

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情