#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比较就会相同。
字符串