Der CIDR-Netzmaske in ruby
Habe ich mit der ip-Adresse Juwel und es scheint nicht zu haben die Fähigkeit, konvertieren von einer Netzmaske von der form
255.255.255.0
in der CIDR-form
/24
Hat jemand eine Ideen, wie Sie schnell konvertieren der alten auf die letztere ?
- Eine Lösung ist wohl die Verwendung der IP-Admin-Juwel stattdessen sieht viel mehr vollständig. Ich bin immer noch daran interessiert zu sehen, was für eine Lösung aus einer Perspektive code ist aber.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist die schnelle und schmutzige Art und Weise
Es sollte die richtige Funktion dafür, die ich nicht finden konnte, also ich zähle "1"
Wenn du gehst, werden mithilfe der Funktion in einer Reihe von Orten und nicht dagegen monkeypatching, könnte dies helfen:
Dann erhalten Sie
32 - (2**32 - 1 - IPAddr.new("255.255.255.0").to_i).to_s(2).length
bits=32;unsigned int ipaddr=0xFFFFFF00;while(ipaddr&1==0){ipaddr=ipaddr>>1;bits--;}
für den oben genannten Fall, müssen erst shift rechts 8-Fach, denke ich.Nur als ein FYI, und halten Sie die info leicht zugänglich für diejenigen, die auf der Suche sind...
Hier ist ein einfacher Weg, um konvertieren von CIDR-Netzmaske zu format:
Zum Beispiel:
Hier ist eine mehr mathematische Ansatz, die Vermeidung Saiten Kosten:
mit "Maske" einen string wie 255.255.255.0. Sie können es ändern, und ändern Sie das erste argument, nur "Maske", wenn "Maske" ist schon ein integer-Darstellung einer IP-Adresse.
So zum Beispiel, wenn die Maske "255.255.255.0", IPAddr.neue(Maske,Socket::AF_INET).to_i werden würde, 0xffffff00, welches dann würden xor mit 0xffffffff, das entspricht 255.
Addieren wir 1 zu, dass es eine vollständige Palette von 256 hosts, dann finden Sie den Logarithmus zur Basis 2 von 256, also 8 (die bits für die host-Adresse), subtrahieren Sie dann, dass 8 von 32, dies entspricht 24 (die verwendeten bits für die Netzwerk-Adresse).
Wir dann cast auf integer, weil Math.log2 liefert einen float.
Quick-and-dirty-Konvertierung:
"255.255.255.0".split(".").map { |e| e.to_i.to_s(2).rjust(8, "0") }.join.count("1").split(".")
=> ich geteilte Maske in ein Array
.map { |e| e.to_i.to_s(2).rjust(8, "0") }
=> Für jedes element in Array:
.to_i
=> Konvertieren in integer
.to_s(2)
=> Konvertierung von integer in Binär
.rjust(8, "0")
=> Hinzufügen-Polsterung
=> Anzeigen return ein Array mit derselben Kardinalität
.join
=> Array Konvertieren in eine vollständige Zeichenfolge
.count("1")
=> Count "1" - Zeichen => Geben CIDR-Maske
Wenn Sie nicht müssen, verwenden Sie die ip-Adresse Juwel, Sie können dies tun, mit der netaddr gem
Den code erreicht die Maskierung durch den Zugriff auf private Instanz-variable *@mask_addr) von IPAddr Instanz (Adresse, ging in serialize_ipaddr). Dies ist nicht der empfohlene Weg (als Instanz-Variablen sind nicht Teil der Klassen der öffentlichen API, aber hier ist es besser als das Parsen der Zeichenfolge aus #inspizieren meiner Meinung nach.
Also der Ablauf ist wie folgt:
255.255.255.0 -> 4294967040 -> 11111111111111111111111100000000
EDIT: Erklärung Hinzugefügt, um die Umsetzung verlangt NathanOliver
Hier ist ein Weg, dies zu tun, ohne die IPAddr gem