Avatar billede bigo Nybegynder
12. februar 2012 - 17:28 Der er 6 kommentarer og
1 løsning

Supernet / Merge ip segmenter

Hejsa.

Jeg har et array af ip adresser/segmenter
$net = array('192.168.1.0/26', '192.168.1.64/26', '192.168.1.128/26');

Jeg har brug for en funktion til at "supernette" dem til nærmest mulige supernet  (i dette tilfælde 192.168.1.0/24)

Nogen der har en ide til dette?
Avatar billede Slettet bruger
12. februar 2012 - 21:29 #1
Her er én måde at gøre det på. IP adresserne bliver konverteret til et heltal og $y ender med at indeholde de bits der er sat som er fælles med alle ip adresserne i første loop. $x bliver 26 efter første loop (minimumsværdien af de tal der står efter '/' i dine segmenter), og efter andet loop ender den med resultatet 24 med dit eksempel, da det er det antal bits der er fælles i starten for alle ip segmenterne.

[code]<?php
$net = array('192.168.1.0/26', '192.168.1.64/26', '192.168.1.128/26');
$x = 32;
$y = pow(2, 32) - 1; // 32-bit integer med alle bits sat
foreach ($net as $segment) {
  $tmp = explode('/', $segment);
  $x = min($x, $tmp[1]);
  $y &= ip2long($tmp[0]);
}
foreach ($net as $segment) {
  $tmp = explode('/', $segment);
  if ($tmp[0] != '0') {
    $x = min(32-strlen(decbin(ip2long($tmp[0]) ^ $y)), $x);
  }
}
echo $x;
?>[/code]
Avatar billede Slettet bruger
12. februar 2012 - 21:30 #2
Prøver igen, da det gik galt med formatteringen

<?php
$net = array('192.168.1.0/26', '192.168.1.64/26', '192.168.1.128/26');
$x = 32;
$y = pow(2, 32) - 1; // 32-bit integer med alle bits sat
foreach ($net as $segment) {
  $tmp = explode('/', $segment);
  $x = min($x, $tmp[1]);
  $y &= ip2long($tmp[0]);
}
foreach ($net as $segment) {
  $tmp = explode('/', $segment);
  if ($tmp[0] != '0') {
    $x = min(32-strlen(decbin(ip2long($tmp[0]) ^ $y)), $x);
  }
}
echo $x;
?>
Avatar billede bigo Nybegynder
13. februar 2012 - 07:48 #3
Og så de dumme..

kan man lave en som er til ipv6 samtidig?

(og når jeg kigger - kan måske bare lave de //32 bit om til 128 bit?)
Avatar billede bigo Nybegynder
13. februar 2012 - 08:17 #4
og så skal man jo ikke kun have CIDR med.. Det supernettede net skal også vises?
Avatar billede bigo Nybegynder
13. februar 2012 - 08:32 #5
Og det fiksede jeg så ligge selv efter at have kigget koden ordenlig igennem ;-)

Tusind tak for hjælpen.. smid et svar..
Avatar billede Slettet bruger
13. februar 2012 - 17:43 #6
Jeg samler ikke, så dem beholder du bare. :)
Avatar billede bigo Nybegynder
15. februar 2012 - 09:41 #7
Ok, tak for hjælpen. ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester