typedef long long unsigned uint64; typedef unsigned int uint32; typedef int int32; typedef unsigned char uint8; static int ParseInteger(const char *buf, int len, int base, uint32 *value) { char *endp; *value = strtoul(buf, &endp, base); while (endp < (buf + len)) { if ((*endp != '\n') && (*endp != ' ') && (*endp != '\t')) { return 0; } endp++; } return 1; } int Parse_Hex(const char *buf, int len, uint32 *value) { return(ParseInteger(buf, len, 16, value)); } static uint64 ParseMAC(const char *val, uint32 vallen) { uint64 MACAddr = 0; uint32 hexlen, hexval; int32 i, macPos; int status = 1; hexlen = 0; macPos = 2; printf("vallen: %d, val: %s\n", vallen, val); for (i = vallen-1; i >= 0 && macPos < 8; i--) { if (val[i] == '-') { if (hexlen <= 2) { int macPos2 = macPos * 2; status = Parse_Hex(&val[i+1], hexlen, &hexval); printf("i: %d, hexlen: %d, status: %d, hexval: 0x%x, macPos: %d\n", i, hexlen, status, hexval, macPos); printf("macPos2: %d\n", macPos2); if (status == 1) { printf("macAddr: 0x%x, 0x%x, 0x%x\n", MACAddr, hexval, hexval << macPos2); MACAddr |= (uint64) (hexval << macPos2); printf("macAddr2: 0x%x\n", MACAddr); macPos++; } else { break; } hexlen = 0; continue; } else { printf("MAC address format error\n"); break; } } hexlen++; } printf("MAC: 0x%llx\n", MACAddr); return MACAddr; } int main (int argc, char** argv) { ParseMAC(argv[1], strlen(argv[1])); return 1; }