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

写在前面:

严格来说mac地址对于每块网卡是固定的,每块网卡被生产出来后,都会有一个全球唯一的编号来标识自己,不会重复,

这个编号就是MAC地址,也就是网卡的物理地址。MAC地址是由48位的二进制数组成,即6个字节(48位)。在通信中是用16进制表示的。

  • 前24位叫做组织唯一标志符(Organizationally Unique Identifier,即OUI),是由IEEE的注册管理机构给不同厂家分配的代码,区分了不同的厂家。

  • 后24位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中MAC地址后24位是不同的

  • MAC 格式: XX:XX:XX:XX:XX:XX

最近需要用到 把字符串转化为MAC地址的形式,根据上面资料我们知道,MAC地址是由48位二进制数组成,即6个字节.

站在字符串的角度来看,MAC地址以字符串格式存储,至少需要12个字节,最终我们需要得到的是一个占6个字节长度为6的int类型数组

这种类型的变量在嵌入式开发领域比较常见,例如u8_t  uint8 等都是这种类型. 通过以上分析,这时我们可以开始用代码实现了.

由于我的盲目猜测,导致花费了一些时间,最终还是通过分析一波,才最后成功转化.

下面我们开始看代码吧,基于C语言的(貌似其他语言也不会用到这)

#include 
#include 
#include 

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;

}

最终实现了转化.

如有错误和不了解的可以评论.谢谢!

 

你可能感兴趣的:(linux,物联网,ESP8266)