Как увеличить MAC-адрес на определенное значение? - PullRequest
0 голосов
/ 09 декабря 2010

У меня есть строка MAC-адреса (без ':'), мне нужно вычислить второй следующий адрес.

Я пытался:

$macDec = hexdec($mac);
$macDec += 2;
$newMac = dechex($macDec);

но это обрезает десятичное значение до целого диапазона, и вычисленный mac неверен, могу ли я сделать это любым простым способом, чем использование BC Math и т. Д.

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010
$mac = increment_mac('00:00:00:00:00:fe', 2);

function increment_mac($mac_address, $increment = 1, $return_partition = ':')
{
    $mac_address = preg_replace('![^0-9a-f]!', '', $mac_address);

    $parts = str_split($mac_address, 2);
    foreach($parts as $i => $hex)
    {
        $parts[$i] = hexdec($hex);
    }

    $increase = true;
    if($increment < 0)
    {
        $increase = false;
    }

    $parts[5] += $increment;
    for($i = 5; $i >= 1; $i--)
    {
        if($increase)
        {
            while($parts[$i] > 255)
            {
                $parts[$i] -= 256;
                $parts[$i - 1] += 1;
            }
        }
        else
        {
            while($parts[$i] < 0)
            {
                $parts[$i] += 256;
                $parts[$i - 1] -= 1;
            }
        }
    }

    foreach($parts as $i => $dec)
    {
        $parts[$i] = str_pad(dechex($dec), 2, 0, STR_PAD_LEFT);
    }

    return implode($return_partition, $parts);
}
1 голос
/ 09 декабря 2010

ОК, я нашел решение, потому что каждый поставщик должен использовать свой собственный VendorID, и стандартным является то, что MTA MAC - это модем MAC + 2, я убираю часть vendorID из mac, делаю простой расчет и добавляем vendorID * 1001.*

function mac2mtaMac($mac) {
    $mac = preg_replace('/[^0-9A-Fa-f]/', '', $mac);
    $macVendorID = substr($mac, 0, 6);
    $macDec = hexdec(substr($mac, 5));
    $macDec += 2;
    $macHex = dechex($macDec);
    $mtaMac = $macVendorID.str_repeat('0', 6 - strlen($macHex)).$macHex;
    return $mtaMac;
}

@ Пол Норман: спасибо за несколько советов о том, как это сделать быстро

0 голосов
/ 07 июня 2013

Не изобретайте велосипед, используйте библиотеку netaddr. Я написал это, чтобы сгенерировать список MAC-адресов на основе диапазона серийных номеров.

from netaddr import *

# Create a list of serial numbers that need MAC addresses
#
sns=range(40125, 40192)

# Create a MAC address and seed it with the first available MAC address then convert 
# that MAC address to an integer for easy math
#
mac = EUI('00-11-22-33-02-D7').value

# Assign a MAC address to every serial number
#
for i in range(len(sns)):
    # Notice that we are creating a MAC address based on an integer
    #
    print "{0},{1}".format(sns[i], str(EUI(mac+i)).replace('-',' '))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...