Вы можете положиться на sscanf, чтобы проверить формат и содержание предоставленного MAC-адреса, что-то вроде

р:

12:45:ff:ab:aa:cd    is valid
45:jj:jj:kk:ui>cd    is not valid
 Cody Gray♦27 янв. 2011 г., 13:44
@eckes: Да, это правильно. Я не вижу ничего, что мешало бы вам перенести реализацию GNU на Win32, но я не знаю стандартной библиотеки C, которая поддерживает регулярные выражения в Windows. Я включил ссылку в качестве предупреждения, и именно поэтому я не опубликовал это как ответ.
 eckes27 янв. 2011 г., 13:39
@Cody Grey: работает только при использовании glibc, верно? Как насчет Windows?
 Cody Gray♦25 янв. 2011 г., 11:01

Ответы на вопрос(4)

ля ":"):

#include <ctype.h>

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 шестнадцатеричных цифр.что, если разделитель двоеточия: появляется во входной строке, она появляется только после четного числа шестнадцатеричных цифр.

Это работает так:

i, которое является числом шестнадцатеричных цифр вmac, устанавливается в 0.while перебирает каждый символ входной строки до тех пор, пока строка не закончится или не будут обнаружены 12 шестнадцатеричных цифр.Если текущий символ (*mac) является действительной шестнадцатеричной цифрой, тоi увеличивается, и цикл проверяет следующий символ.В противном случае цикл проверяет, является ли текущий символ разделителем (двоеточие или тире); если это так, он проверяет наличие одного разделителя для каждой пары шестнадцатеричных цифр. В противном случае цикл прерывается.После завершения цикла функция проверяет, были ли найдены 12 шестнадцатеричных цифр и ноль или ровно пять разделителей, и возвращает результат.

Если вы не хотите принимать разделители, просто измените оператор return на:

return (i == 12 && s == 0);
 Daniel Gehriger25 янв. 2011 г., 11:51
Добавлено описание. Функция также принимает такие вещи, как «1245ffabaacd», так как они часто являются действительными MAC-адресами. Вы можете также принять "12-45-ff-ab-aa-cd". Дайте мне знать, если это так.
 mujahid25 янв. 2011 г., 12:19
спасибо большое очень много Даниэль !! Работал!! на самом деле насыщение таково: «пользователь вводит mac-адреса в текстовое поле, нажимая клавишу ввода после каждого MAC-адреса, разбивая их на токены и проверяя правильность каждого mac! Помоги мне!!!
 mujahid25 янв. 2011 г., 12:02
я делаю это в тени --- >> if (isValidMacAddress (pch)) {printf ("% s \ n", pch); } else {printf ("НЕ правильный MAC-адрес! \ n"); } ----- >>>>> он всегда печатает "недопустимый MAC-адрес". Пожалуйста, ответьте, пожалуйста, спасибо.
 Daniel Gehriger25 янв. 2011 г., 12:03
Да, вот как вы бы это использовали.
 mujahid25 янв. 2011 г., 11:38
спасибо, Даниэль, но я не понимаю логику должным образом ... плз плз вкратце плз ....

чтобы проверить формат и содержание предоставленного 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]));
}

так что вот функция. Возвращает 1 в случае, если MAC-адрес был проверен (он будет принимать 12 шестнадцатеричных символов, строчные или прописные, с двоеточиями или без них, включая частично правильный ввод, напримерb3:0a:23:48fad3). Это делает работу для меня во встроенном приложении на контроллере cortex m3.
Функция также будет принимать прямой ввод с веб-страницы (именно так я и использую), и поэтому она будет принимать двоеточия как%3A персонажи.
В результате получается массив из шести байтов. Тебе придется#include <cctype> для этого.
Входная строка (*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)
}

#include <stdio.h>
#include <string.h>

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

Ваш ответ на вопрос