2010-12-09 3 views
0

Ich habe eine MAC-Adresse Zeichenfolge (ohne ':' drin) Ich muss die nächste Adresse berechnen.Wie wird die MAC-Adresse um einen definierten Wert erhöht?

Ich habe tryed zu:

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

aber diese trimmt Dezimalwert Bereich auf Integer und berechnet mac falsch ist, kann ich tun dies in jedem auf einfache Weise als usw. BC Math verwenden?

+1

Was in aller Welt für? MAC-Adressen sind in der Regel völlig zufällig (außer vielleicht, wenn Sie der Hersteller sind und eine Charge von identischen Produkten haben) –

+0

Da jeder VoIP-MTA-Agent Kabelmodems angeschlossen hat vordefinierte MAC-Adresse, die Modem MAC + 2 ist ... – canni

+0

@ canni ah , Meinetwegen. –

Antwort

1

OK, fand ich eine Lösung, wegen der Tatsache, dass jeder Hersteller seine eigenen VendorID verwenden hat, und Standard dass MTA MAC ist Modem MAC + 2 i vendorID Teil von Mac abzustreifen, eine einfache Berechnung tun, und prepend vendorID

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

@ Paul Norman: thx für ein paar Hinweise, wie das zu tun, schnell

2
$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); 
} 
0

Sie das Rad nicht neu zu erfinden, die netaddr Bibliothek verwenden. Ich schrieb dies, um eine Liste von MAC-Adressen basierend auf einem Seriennummernbereich zu generieren.

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('-',' '))