MAC地址在18字節及6字節之間的轉換


#include <stdio.h>
#include <string.h>

#define unsigned char u8
#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;
}

感受這樣仍是有些問題:code

6字節爲 u8類型,進行強轉以後內存會有變化,可能結果正確可是相同的 18字節MAC轉換完成以後用memcmp比較會提示不一樣;orm

而後我用搞了下面這個方法;內存

#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];
    }
    return;
}

    u32 mac_add_tmp_b[6] = {0};
   /*先轉爲u32*/
    sscanf(mac_add, MACSTR, MACLTOS(mac_add_tmp_b)); 
    mac_to_net(mac_add_tmp_b,mac_add_tmp);

這樣以後 相同的字符串轉化 用memcpy比較就會相同。
字符串

相關文章
相關標籤/搜索