2013-12-11 64 views
1

我想在這方面像這樣的sprintf一些發現網絡MAC地址的MAC地址的sprintf:可用網絡

 `WiFi connection settings: 
     MAC: 00 1E C0 10 3B 19 
     SSID:   css` 

我的代碼是:

char buf[32]; 
BYTE MAC[64]; 
int i; 

for(i=1;i<15;i++) 
{ 
    MyScanResults = WFScanList(i); 
    sprintf(buf,"%s", MyScanResults.ssid); 
    sprintf(&MAC[i*2],"%02x", MyScanResults.bssid[i]); 
    _dbgwrite("SSID:   "); 
    _dbgwrite(buf); 
    _dbgwrite("\n"); 
    _dbgwrite("MAC:   "); 
    _dbgwrite(MAC); 
} 

和錯誤是:

C:\ Users \ h \ Desktop \ WiFi test \ taskFlyport.c:22:warning:'sprintf'參數1中的指針對象在簽名方面不同<

C:\用戶\^h \桌面\ WiFi測試\ taskFlyport.c:27:警告:指針目標在通過的 '_dbgwrite' 參數1符號性<

不同的是有沒有人告訴我我的問題在哪裏? 感謝,視

回答

1

字節是一個unsigned charMAC因此是unsigned char[]

sprintf想要char*

更改MAC的聲明:

char MAC[64]; 

這裏有一個演示:

char mac[64]; 
unsigned long long testMac = 0xAABBCCDDEEFF; 

// without spaces 
sprintf(mac, "MAC is: %llX", testMac); 
printf("%s\n", mac); 

// with spaces - not sure if order is correct! 
unsigned char* pTestMac = (unsigned char*)&testMac; 
sprintf(mac, "MAC is: %X %X %X %X %X %X", 
    (unsigned)pTestMac[5], 
    (unsigned)pTestMac[4], 
    (unsigned)pTestMac[3], 
    (unsigned)pTestMac[2], 
    (unsigned)pTestMac[1], 
    (unsigned)pTestMac[0] 
    ); 
printf("%s\n", mac); 

輸出:

MAC is: AABBCCDDEEFF 
MAC is: AA BB CC DD EE FF 
+0

謝謝你的回覆。我根據相關結構定義寫了字節,現在我沒有任何警告,但是我的結果是一樣的,就像:MAC:?? 5217356f和MAC:?? 5217 – J2015

+0

@HOsseiNSA This是因爲你的循環以'i = 1'開始,導致你跳過'MAC'中的兩個第一個字符。 – unwind

+0

@HOsseiNSA - 添加代碼。請注意,您使用的printf格式不適用於大數字(64位)。在答案中查看我的演示代碼。 – egur

2

您還可以使用的東西喜歡在一些項目完成爲wpa_supplicant

他們定義一些宏來幫助印刷MAC不會忽略(link):

#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] 
#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" 

最後使用它像(link):

unsigned char mac[6] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66}; 
printf("My mac is " MACSTR "\n", MAC2STR(mac)); 

輸出是:

My mac is 11:22:33:44:55:66 

在整個項目中使用起來要容易得多。