MAC地址的字符串形式转化为标准的MA地址

写在前面:数组

严格来讲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;

}

最终实现了转化.

若有错误和不了解的能够评论.谢谢!