sscanf在PowerPC下的小技巧

字號:

#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轉化成數(shù)值。在x86平臺下,一切都能正常通過。mac數(shù)組得到了我們想要的結果??墒堑搅薖ower平臺下,就郁悶了,mac數(shù)組全是0。這是為什么呢?
    首先,我們應該了解一下兩種CPU的區(qū)別。x86屬于LITTLE_ENDIAN,而Power屬于BIG_ENDIAN。那什么是LITTLE_ENDIAN、BIG_ENDIAN呢?
    下面,我來舉個例子。一個32位的整型數(shù),如0x12345678,在不同平臺下,存放形式:
    內(nèi)存地址 LITTLE_ENDIAN BIG_ENDIAN
    0x0000 78 12
    0x0001 56 34
    0x0002 34 56
    0x0003 12 78
    然后,就是"02x"了。它指的是一個16進制數(shù)??墒钦级嗌傥荒兀窟@就要看你的CPU是多少的位了。一般來說,現(xiàn)在的CPU,都是32位。其實,也就是一個整型數(shù)占多少位。
    在x86(32位)平臺下,先將mac[0]填充為"fa",但是"02x"要占用32位,所以它分別又將mac[1]、mac[2]和mac[3]填充為0(0x000000fa)。其實,此時已經(jīng)屬于越界訪問了,但程序并不會出錯。下面的以此類推。
    在Power(32位)平臺下,同理。但是要注意的是,它是將高位字節(jié)填充到低地址中。所以,這樣下去后,整個mac數(shù)組就是全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進制數(shù)。這樣問題,就解決了。