|
今天要从配置文件中读MAC地址,习惯上写成 sscanf (buf, "%02X:02X:02X:02X:02X:02X", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5] );
因为看代码中,printf的时候都是这样的格式。 在我的机器上写了测试程序测试成功,谁知等我交叉编译到PowerPC平台下, 这段代码就不好使了,还让我迷茫了半天。后来推敲是因为X86与Power移植的问题, 再深入想到是BIG_ENDIAN与LITTLE_ENDIAN的问题, 根本原因还是格式串使用不正确。 我要取字符串中的两个字符并且把它们当作8位的HEX值,送给mac[i], 我的格式字符串使用的是打印MAC地址通用的格式串,反过来给sscanf用就不对了, 格式串中的格式%02X,仅表示把源串中的两个字符当作一个16进制整数, 并不是说当作一个8位的16进制整数, 结果就是程序从源串中解析出6个16进制数,并且分别赋值给&mac[i], 当然,在X86的机器上,整数的最低位恰好放在指定的mac[i]中,高位则覆盖其后的mac[i+1],...的内容, 所以在我的X86机器上运行程序是正确的,但是到了PowerPC上, 地址的低位放的是整数的高位内容,所以mac[]数组被清0。
我真正需要的格式串,其实是要指定后面指针类型的,被称为type modifier characters的东东
查看手册,hh正是我想要的东西,最后的格式串改成
"%hhX:hhX:hhX:hhX:hhX:hhX"
一切OK了
|