#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ù)。這樣問題,就解決了。
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ù)。這樣問題,就解決了。