写在前面:
严格来说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;
}
最终实现了转化.
如有错误和不了解的可以评论.谢谢!