2013-12-11 39 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 

在整个项目中使用起来要容易得多。