从字符串中获取mac地址的获取

记录一下,比较常用。

我使用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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值