Форматы записи MAC-адресов

MAC-адрес (Media Access Control Address) — уникальный идентификатор сетевого интерфейса устройства. Библиотека Validator.js предоставляет встроенные средства проверки корректности MAC-адресов через метод isMACAddress().

Поддерживаются различные варианты записи:

  • двоеточия (:)
  • дефисы (-)
  • точки (.)
  • непрерывная hexadecimal-запись
  • запись в верхнем и нижнем регистрах

Метод isMACAddress()

Для проверки используется функция:

validator.isMACAddress(str [, options])

Подключение

const validator = require('validator');

Либо:

import validator from 'validator';

Классический формат с двоеточиями

Наиболее распространённый формат:

01:23:45:67:89:ab

Проверка

validator.isMACAddress('01:23:45:67:89:ab');

Результат:

true

Допустимы символы

Каждая группа содержит:

  • две шестнадцатеричные цифры

  • диапазон:

    • 0-9
    • a-f
    • A-F

Пример:

validator.isMACAddress('AA:BB:CC:DD:EE:FF');
true

Формат с дефисами

Некоторые системы используют разделитель -.

Пример:

01-23-45-67-89-ab

Проверка

validator.isMACAddress('01-23-45-67-89-ab');
true

Cisco-формат с точками

Сетевое оборудование Cisco часто использует запись:

0123.4567.89ab

Проверка

validator.isMACAddress('0123.4567.89ab');
true

Особенность

Адрес делится на три блока:

XXXX.XXXX.XXXX

Каждый блок содержит 4 hexadecimal-символа.


Непрерывная hexadecimal-запись

Некоторые приложения используют MAC-адрес без разделителей:

0123456789ab

Проверка

validator.isMACAddress('0123456789ab', {
  no_separators: true
});
true

Параметр no_separators

Опция разрешает запись без разделителей.

Пример

validator.isMACAddress('aabbccddeeff', {
  no_separators: true
});
true

Без опции

validator.isMACAddress('aabbccddeeff');
false

Ограничение конкретным разделителем

Validator.js позволяет требовать строго определённый формат.

Опция eui

Поддерживаемые значения:

Значение Формат
48 MAC-48
64 EUI-64

Проверка EUI-48

Классический MAC-адрес состоит из 48 бит.

Пример

validator.isMACAddress('01:23:45:67:89:ab', {
  eui: '48'
});
true

Проверка EUI-64

Формат EUI-64 содержит 64 бита.

Пример:

01:23:45:67:89:ab:cd:ef

Проверка

validator.isMACAddress('01:23:45:67:89:ab:cd:ef', {
  eui: '64'
});
true

Разница между EUI-48 и EUI-64

EUI-48

Содержит:

6 байт
12 hexadecimal-символов

Пример:

aa:bb:cc:dd:ee:ff

EUI-64

Содержит:

8 байт
16 hexadecimal-символов

Пример:

aa:bb:cc:dd:ee:ff:11:22

Недопустимые символы

Validator.js отклоняет любые символы вне hexadecimal-диапазона.

Ошибка

validator.isMACAddress('01:23:45:67:89:ZZ');
false

Неполные адреса

Недостаточное количество блоков приводит к ошибке проверки.

Пример

validator.isMACAddress('01:23:45:67:89');
false

Смешивание разделителей

Использование разных разделителей одновременно запрещено.

Неверно

validator.isMACAddress('01:23-45:67-89:ab');
false

Проверка пользовательского ввода

Частый сценарий — валидация данных формы.

Пример

function validateMac(mac) {
  if (!validator.isMACAddress(mac)) {
    throw new Error('Некорректный MAC-адрес');
  }

  return true;
}

Нормализация MAC-адреса

Перед сохранением часто выполняется унификация формата.

Пример

function normalizeMac(mac) {
  return mac
    .toLowerCase()
    .replace(/-/g, ':');
}

Использование

const mac = normalizeMac('AA-BB-CC-DD-EE-FF');

console.log(mac);

Результат:

aa:bb:cc:dd:ee:ff

Совмещение проверки и нормализации

Практический вариант:

function processMac(mac) {
  const normalized = mac
    .toLowerCase()
    .replace(/-/g, ':');

  if (!validator.isMACAddress(normalized)) {
    return null;
  }

  return normalized;
}

Проверка массива MAC-адресов

Пример

const macs = [
  '00:11:22:33:44:55',
  'AA-BB-CC-DD-EE-FF',
  'invalid'
];

const validMacs = macs.filter(mac =>
  validator.isMACAddress(mac)
);

console.log(validMacs);

Результат:

[
  '00:11:22:33:44:55',
  'AA-BB-CC-DD-EE-FF'
]

Использование в Express.js

Middleware для проверки

app.post('/device', (req, res) => {
  const { mac } = req.body;

  if (!validator.isMACAddress(mac)) {
    return res.status(400).json({
      error: 'Некорректный MAC-адрес'
    });
  }

  res.json({
    success: true
  });
});

Проверка без учёта регистра

Validator.js автоматически поддерживает:

  • aa:bb:cc:dd:ee:ff
  • AA:BB:CC:DD:EE:FF
  • смешанный регистр

Пример

validator.isMACAddress('Aa:Bb:Cc:Dd:Ee:Ff');
true

Сравнение популярных форматов

Формат Пример
Colon-separated 01:23:45:67:89:ab
Hyphen-separated 01-23-45-67-89-ab
Cisco-style 0123.4567.89ab
Без разделителей 0123456789ab

Проверка с собственным регулярным выражением

Иногда требуется строгий формат.

Только двоеточия

const regex = /^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$/;

Использование

regex.test('01:23:45:67:89:ab');
true

Комбинирование Validator.js и RegExp

Validator.js можно использовать как базовую проверку, а регулярное выражение — как дополнительное ограничение.

Пример

function validateStrictMac(mac) {
  const strict = /^([0-9a-f]{2}:){5}[0-9a-f]{2}$/;

  return (
    validator.isMACAddress(mac) &&
    strict.test(mac)
  );
}

Проверка EUI-64 без разделителей

Пример

validator.isMACAddress(
  '0011223344556677',
  {
    eui: '64',
    no_separators: true
  }
);
true

Частые ошибки

Лишние символы

validator.isMACAddress('01:23:45:67:89:ab:');
false

Пробелы

validator.isMACAddress(' 01:23:45:67:89:ab ');
false

Решение

validator.isMACAddress(mac.trim());

Неверная длина блока

validator.isMACAddress('1:23:45:67:89:ab');
false

Проверка перед записью в базу данных

async function saveDevice(mac) {
  const normalized = mac.trim().toLowerCase();

  if (!validator.isMACAddress(normalized)) {
    throw new Error('Ошибка MAC-адреса');
  }

  await db.devices.insert({
    mac: normalized
  });
}

Валидация в React

Пример компонента

import validator from 'validator';
import { useState } from 'react';

function MacInput() {
  const [mac, setMac] = useState('');
  const [error, setError] = useState('');

  function handleChange(e) {
    const value = e.target.value;

    setMac(value);

    if (!validator.isMACAddress(value)) {
      setError('Некорректный MAC');
    } else {
      setError('');
    }
  }

  return (
    <>
      <input
        value={mac}
        onCha nge={handleChange}
      />

      {error && <p>{error}</p>}
    </>
  );
}

Проверка MAC-адресов в TypeScript

Пример

import validator from 'validator';

function isValidMac(mac: string): boolean {
  return validator.isMACAddress(mac);
}

Внутренний принцип проверки

Validator.js проверяет:

  1. соответствие допустимому шаблону;
  2. корректность hexadecimal-символов;
  3. длину адреса;
  4. единообразие разделителей;
  5. соответствие EUI-48 или EUI-64;
  6. наличие или отсутствие разделителей согласно настройкам.

Поддерживаемые варианты записи

Формат Поддержка
aa:bb:cc:dd:ee:ff Да
AA-BB-CC-DD-EE-FF Да
aabb.ccdd.eeff Да
aabbccddeeff Да, с no_separators
aa:bb:cc:dd:ee Нет
gg:bb:cc:dd:ee:ff Нет
aa-bb:cc-dd:ee-ff Нет