MAC地址在18字节及6字节之间的转换

MAC进行字节转换


#define unsigned int u32
#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
#define MACSTOL(a)  (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
#define MACLTOS(a)  (u32 *)&(a)[0], (u32 *)&(a)[1], (u32 *)&(a)[2], (u32 *)&(a)[3], (u32 *)&(a)[4], (u32 *)&(a)[5]
 
 
int main(int argc,char argv[])
{
    u8 mac_add[18] = "00:12:32:4a:56:7b";
    u8 mac_add_tmp[6] = {0};
    u8 mac_add_test[18] = {0};
     
    /*用sscanf将18字节转为6字节,有的编译器可以不用(u32 *)进行强转*/
    sscanf(mac_add, MACSTR, MACLTOS(mac_add_tmp));
    /*6字节转为18字节*/
    snprintf(mac_add_test, 18, MACSTR, MACSTOL(mac_add));
     
    printf("original : %s  new : %s\n", mac_add, mac_add_test);
    return 0;
}


感觉这样还是有些问题:

6字节为 u8类型,进行强转之后内存会有变化,可能结果正确但是相同的 18字节MAC转换完成之后用memcmp比较会提示不同;

然后我用搞了下面这个方法;

#define MACLTOS(a)  &(a)[0],&(a)[1], &(a)[2],&(a)[3],&(a)[4], &(a)[5]
 
static void mac_to_net(u32* a, u8* b)
{
    u32 i = 0;
    for(i = 0; i < 6; i++)
    {
        b[i] = (u8)a[i];
    }
}
 
u32 mac_add_tmp_b[6] = {0};
sscanf(mac_add, MACSTR, MACLTOS(mac_add_tmp_b)); //先转为u32
mac_to_net(mac_add_tmp_b,mac_add_tmp);


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值