记录一下,比较常用。
我使用char mac[6]时运行报错。可能是"%02x:%02x:%02x:%02x:%02x:%02x" 每一个%02x对应输出的是4个字节导致mac数组访问越界了。
parse_dev_id:105 id src:68:89:75:0A:95:37 dst:6889750a9537
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
后来我改成char mac[50],或者int mac[6]就好了。此类段错误要引以为戒。但是char mac[6]我在别处这么用好像有是正常的。
不过写程序一定要稳,所以推荐以后使用int mac_tmp[6],再转char mac[6]。
int parse_dev_id(char* src, char* dst, int len)
{
if (!src || !dst || len <= 0)
{
printf ("%s:%d param err\n", __func__, __LINE__);
return -1;
}
memset(dst, 0, len);
int ret = 0;
char* format = NULL;
char* def_mac = "11:22:33:44:55:66";
int mac[6]; /* int is very important */
if(strlen(src) == strlen(def_mac)){
format = "%02x:%02x:%02x:%02x:%02x:%02x";
}
else if (strlen(src) == strlen(def_mac)-5){
format = "%02x%02x%02x%02x%02x%02x";
}
if(format)
{
ret = sscanf(src, format, mac, mac+1, mac+2, mac+3, mac+4, mac+5);
printf ("%s:%d mac ret=%d\n", __func__, __LINE__, ret);
if (ret != 6){
printf ("%s:%d mac format is error\n", __func__, __LINE__);
snprintf(dst, len, "%s", src);
}
else{
snprintf(dst, len, "%02x%02x%02x%02x%02x%02x",
0xff & mac[0], 0xff & mac[1], 0xff & mac[2],
0xff & mac[3], 0xff & mac[4], 0xff & mac[5]);
}
}
else
{
printf ("%s:%d not mac format\n", __func__, __LINE__);
snprintf(dst, len, "%s", src);
}
printf ("%s:%d id src:%s dst:%s\n", __func__, __LINE__, src, dst);
return 0;
}
这个函数的功能就是,输入mac字符串,输出统一格式的mac字符串(去除 ' :' 和将大写统一变小写)。混合的和简写的mac地址搞不了。
./term 68:89:75:0A:95:37
parse_dev_id:110 id src:68:89:75:0A:95:37 dst:6889750a9537
./term 6889750A9537
parse_dev_id:110 id src:6889750A9537 dst:6889750a9537
./term 6889750a9537
parse_dev_id:110 id src:6889750a9537 dst:6889750a9537
====================================================================================================
另一个方法
bool subMac(string& src, string& des)
{
if(src.length()==0)
return false;
int pos = 0;
for(int i=0; i<src.length(); i++)
{
if((i%3) != 2)
{
des[pos] = src[i];
pos++;
}
}
}
int main()
{
string srcMac = "11:22:33:44:55:66";
string desMac= "";
subMac(srcMac, desMac);
printf("srcMac: %s\n", srcMac.data());
printf("desMac: %s\n", desMac.data());
}
Starting /home/chen/Desktop/XXX/mac-p/release/mac-p...
srcMac: 11:22:33:44:55:66
desMac: 112233445566
/home/chen/Desktop/XXX/mac-p/release/mac-p exited with code 0