#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;
}