如何validation字符串是否是C中的有效MAC地址?

例:

 12:45:ff:ab:aa:cd有效
 45:jj:jj:kk:ui> cd无效

以下代码检查有效的MAC地址(使用或不使用“:”分隔符):

#include  int isValidMacAddress(const char* mac) { int i = 0; int s = 0; while (*mac) { if (isxdigit(*mac)) { i++; } else if (*mac == ':' || *mac == '-') { if (i == 0 || i / 2 - 1 != s) break; ++s; } else { s = -1; } ++mac; } return (i == 12 && (s == 5 || s == 0)); } 

代码检查以下内容:

  • 输入字符串mac恰好包含12个hex数字。
  • 如果输入字符串中出现分隔符冒号:它只出现在偶数个hex数字后面。

它的工作原理如下:

  • i ,即mac的hex数字,初始化为0。
  • while循环遍历输入字符串中的每个字符,直到字符串结束,或者检测到12个hex数字。
    • 如果当前字符( *mac )是有效的hex数字,则i递增,循环检查下一个字符。
    • 否则,循环检查当前字符是否为分隔符(冒号或破折号); 如果是,则validation每对hex数字都有一个分隔符。 否则,循环中止。
  • 循环结束后,函数检查是否找到12个hex数字,零或五个分隔符,并返回结果。

如果您不想接受分隔符,只需将return语句更改为:

 return (i == 12 && s == 0); 

我需要在ANSI C中validation和解析MAC地址,所以这是函数。 如果mac地址已经过validation,它将返回1(它将接受12个hex字符,小写或大写,有或没有冒号,包括部分正确的输入,如b3:0a:23:48fad3 )。 它在我的皮质m3控制器上的嵌入式应用程序中完成了这项工作。
该函数还将接受来自网页的直接输入(实际上我是如何使用它),因此它将接受冒号作为%3A字符。
结果是一个六字节数组。 你必须为这个#include
输入字符串( *mac )必须为零终止才能使函数正常工作。

 int parse_mac_address(char* mac, unsigned char *mac_address) { int index=0; char temp_mac[12]={0,0,0,0,0,0,0,0,0,0,0,0}; memset(mac_address, 0, 6); // Clear the 6 needed bytes in target array (which should be defined as "unsigned char mac_address[6]") while(*mac) { // Repeat while we have something in the string if(index>11) { // The string may be longer than our 12 digits return 0; // If it has too many digits, break out and return an error (zero) } if(isxdigit(*mac)) { // If this is a hex digit if(isdigit(*mac)) { // If the digit is 0 to 9 temp_mac[index]=*mac-0x30; // Convert to a number } else { // If the digit is A to F temp_mac[index]=toupper(*mac)-0x37; // Make sure it is an upper case letter and convert to a number } ++mac; // Go further on the mac string ++index; // Promote the index to the next value in our array } else { if(!(index%2) && *mac==':') { // If it was not a digit, it can be a colon, but only on an odd locations in the array ++mac; } else { if(!(index%2) && *mac=='%' && *(mac+1)=='3' && toupper(*(mac+2))=='A') { // In case of web colon sign we receive '%3A' instead, so we have to jump 3 characters to the next digit mac+=3; } else { // If we discovered anything else, this is not a valid mac address - break out and return an error (zero) return 0; } } } } if(index!=11) { // Last check - the index must be exactly 11, to indicate we have filled in 12 digits return 0; // If not - return with error (zero) } for(index=0;index<6;index++) { // Now, when we have 12 digits in an array, we will convert them in to two-digit bytes *(mac_address+5-index)=temp_mac[index*2+1]+temp_mac[index*2]*0x10; // Taking pairs of digits and converting them in to a byte // This operation will make mac_address[0] the LSB and mac_address[5] the MSB // If you need it the other way round, replace *(mac_address+5-index) with *(mac_address+index) } return 1; // Return OK (one) } 

这是检查MAC地址健全性的另一个简单function

 #include  #include  typedef unsigned char byte; #define ETH_ADDR_LEN 6 #define FALSE 0 #define TRUE 1 #define MAC_STR_LEN 18 #define SEPERATOR ':' int isMacValid(char *MacAddress) { char mac_part[3] = {0}; byte mac_byte = 0; byte mac_idx = 0; while(MacAddress[mac_idx] != 0 && mac_idx < MAC_STR_LEN){ if(mac_idx != 15 && MacAddress[mac_idx + 2] != SEPERATOR) return FALSE; strncpy(mac_part, MacAddress+mac_idx,2); mac_byte = (byte)strtol(mac_part, NULL, 16); if(mac_byte == 0 && strcmp(mac_part,"00")) return FALSE; mac_idx += 3; } if(mac_idx == MAC_STR_LEN) return TRUE; return FALSE; } 

您可以依靠sscanf来检查所提供的MAC地址的格式和内容,例如

 bool checkMacAddr(const char * mac) noexcept { if(nullptr == mac) return false; printf("[%s] strlen(%s)=%lu\n", __func__, mac, strlen(mac)); if(strlen(mac) != 17) return false; uint32_t bytes[6]={0}; return (6 == sscanf(mac, "%02X:%02X:%02X:%02X:%02X:%02X" , &bytes[5] , &bytes[4] , &bytes[3] , &bytes[2] , &bytes[1] , &bytes[0])); }