写在前面:数组
严格来讲mac地址对于每块网卡是固定的,每块网卡被生产出来后,都会有一个全球惟一的编号来标识本身,不会重复,测试
这个编号就是MAC地址,也就是网卡的物理地址。MAC地址是由48位的二进制数组成,即6个字节(48位)。在通讯中是用16进制表示的。ui
前24位叫作组织惟一标志符(Organizationally Unique Identifier,即OUI),是由IEEE的注册管理机构给不一样厂家分配的代码,区分了不一样的厂家。code
后24位是由厂家本身分配的,称为扩展标识符。同一个厂家生产的网卡中MAC地址后24位是不一样的开发
MAC 格式: XX:XX:XX:XX:XX:XX字符串
最近须要用到 把字符串转化为MAC地址的形式,根据上面资料咱们知道,MAC地址是由48位二进制数组成,即6个字节.string
站在字符串的角度来看,MAC地址以字符串格式存储,至少须要12个字节,最终咱们须要获得的是一个占6个字节长度为6的int类型数组io
这种类型的变量在嵌入式开发领域比较常见,例如u8_t uint8 等都是这种类型. 经过以上分析,这时咱们能够开始用代码实现了.class
因为个人盲目猜想,致使花费了一些时间,最终仍是经过分析一波,才最后成功转化.变量
下面咱们开始看代码吧,基于C语言的(貌似其余语言也不会用到这)
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *str = (char*)malloc(32); memset(str,0,32); char *strstr = "0x16-0x34-0x56-0x78-0x90-0xab\0"; printf("len = %d\n",strlen(strstr)); sprintf(str,strstr); printf("len = %d\n",strlen(str)); char *ptr = (char *)malloc(4); memset(ptr,0,4); char *p; printf("开始分割前:%s\n",str); printf("开始分割:\n"); ptr = strtok(str,"-"); int a[6]={0}; int i=0; while(ptr !=NULL) { printf("ptr = %s\n",ptr); sscanf(ptr,"%4x",&a[i]); printf("a[%d]= %02x\n",i,a[i]); memset(ptr,0,4); ptr = strtok(NULL,"-"); i++; } for(i = 0;i<6;i++) { printf("a[%d]=%x ",i,a[i]); } return 0; }
这个只是基于Windows下C语言的程序,测试程序,未了检测这种思路是否可行,经测试.彻底没问题
但在实际开发中,还需修改,以下代码才算完整:
void SET_MAC() { char *str = (char*)malloc(32); memset(str,0,32); snprintf(str,32,"0x16-0x34-0x56-0x78-0x90-0xab\0"); printf("str_len = %d\n",strlen(str)); char *ptr = (char *)malloc(4); memset(ptr,0,4); u8_t a[LENG]={0}; int32 tmp; int32 i=0; ptr = strtok(str,"-"); while(ptr !=NULL) { printf("ptr = %s---",ptr); sscanf(ptr,"%x",&tmp); printf("tmp = %d ----",tmp); a[i] = (u8_t)tmp; printf("a[%d] = %d",i,a[i]); memset(ptr,0,4); ptr = strtok(NULL,"-"); i++; } free(str); str = NULL; free(ptr); ptr = NULL; }
最终实现了转化.
若有错误和不了解的能够评论.谢谢!