#include <stdio.h>
#include <string.h>
#include <linux/if_ether.h>
#include <ctype.h>
#include <inttypes.h>
static int str_to_hwaddr(uint8_t *hwaddr, const char *str)
{
char c;
uint8_t used = 0;
uint8_t quarter = 0;
memset(hwaddr, 0, ETH_ALEN);
while(isspace(*str)) ++str;
while('\0' != *str) {
c = *str++;
switch(c) {
default :
if(strchr("-:. ", c)) {
if(used) {
++hwaddr;
used = 0;
}
continue;
}
return -1;
case '0' ... '9':
quarter = c - '0';
break;
case 'a' ... 'f':
quarter = c - 'a' + 10;
break;
case 'A' ... 'F':
quarter = c - 'A' + 10;
break;
}
*hwaddr = ((*hwaddr)<<4) + quarter;
if(used) ++hwaddr;
used = !used;
}
return 0;
}
static int print_hwaddr(const char *mac)
{
uint8_t hwaddr[ETH_ALEN];
str_to_hwaddr(hwaddr, mac);
fprintf(stdout, "mac: %s, hwaddr: %02X:%02X:%02X:%02X:%02X:%02X\n",
mac,
(uint32_t)hwaddr[0], (uint32_t)hwaddr[1],
(uint32_t)hwaddr[2], (uint32_t)hwaddr[3],
(uint32_t)hwaddr[4], (uint32_t)hwaddr[5]);
return 0;
}
int main(int argc, char *argv[])
{
char mac[128];
strcpy(mac, "0.1-0:203040506");
print_hwaddr(mac);
strcpy(mac, "010...20304050*67");
print_hwaddr(mac);
strcpy(mac, "a");
print_hwaddr(mac);
strcpy(mac, "0123456789aBcDeF");
print_hwaddr(mac);
strcpy(mac, "010203040506");
print_hwaddr(mac);
return 0;
}mac字符串转hwaddr,支持各种格式
最新推荐文章于 2021-05-13 04:14:20 发布
该博客介绍了一个C语言函数,用于将不同格式的字符串转换为MAC地址。函数`str_to_hwaddr`解析包含破折号、冒号、点或空格分隔的十六进制数,并将它们转化为6字节的硬件地址。博客通过示例展示了如何处理各种输入,如`0.1-0:203040506`、`010...20304050*67`等。
304

被折叠的 条评论
为什么被折叠?



