Ich habe die IP-Adresse gem verwendet und es scheint nicht die Fähigkeit zu haben, von einer Netzmaske des Formulars zu konvertieren
%Vor%in das CIDR-Formular
%Vor%Hat jemand eine Idee, wie man Ersteres schnell in Letzteres umwandeln kann?
Hier ist der schnelle und schmutzige Weg
%Vor%Es sollte eine korrekte Funktion dafür geben, ich konnte das nicht finden, also zähle ich einfach "1"
Wenn Sie die Funktion an mehreren Stellen verwenden und monkeypatching nichts ausmacht, könnte dies helfen:
%Vor%Dann bekommst du
%Vor%Nur als ein FYI, und um die Informationen für diejenigen, die suchen, leicht zugänglich zu halten ...
Hier ist eine einfache Methode, um von CIDR in das Netzmaskenformat zu konvertieren:
%Vor%Zum Beispiel:
%Vor%Hier ist ein mathematischer Ansatz, der Strings um jeden Preis vermeidet:
%Vor%wobei "mask" eine Zeichenfolge wie 255.255.255.0 ist. Sie können sie ändern und das erste Argument in "Maske" ändern, wenn "Maske" bereits eine ganzzahlige Darstellung einer IP-Adresse ist.
Wenn zum Beispiel mask "255.255.255.0" war, würde IPAddr.new (Maske, Socket :: AF_INET) .to_i zu 0xffffff00 werden, was dann mit 0xffffffff xor'd ist, was 255 entspricht.
Wir fügen 1 hinzu, um es zu einem vollständigen Bereich von 256 Hosts zu machen, finden dann die logarithmische Basis 2 von 256, was 8 entspricht (die für die Hostadresse verwendeten Bits), dann subtrahiere diese 8 von 32, was 24 entspricht (die für die Netzwerkadresse verwendeten Bits).
Wir werfen dann auf Integer, weil Math.log2 einen Gleitkommawert zurückgibt.
Schnelle und schmutzige Konvertierung:
"255.255.255.0".split(".").map { |e| e.to_i.to_s(2).rjust(8, "0") }.join.count("1").split(".")
= & gt; Ich spalte die Maske in einem Array
.map { |e| e.to_i.to_s(2).rjust(8, "0") }
= & gt; Für jedes Element in Array:
.to_i
= & gt; In Ganzzahl konvertieren
.to_s(2)
= & gt; Konvertiere Ganzzahl in Binärzahl
.rjust(8, "0")
= & gt; Füge Padding hinzu
= & gt; Map gibt ein Array mit derselben Kardinalität zurück
.join
= & gt; Konvertieren von Array in eine vollständige Zeichenfolge
.count("1")
= & gt; Zähle "1" Zeichen = & gt; Gib die CIDR-Maske an
%Vor%Wenn Sie nicht die IP-Adresse gem verwenden müssen, können Sie dies mit dem netaddr Juwel
%Vor%Der Code erreicht die Maskierung durch Zugriff auf die private Instanzvariable * @ mask_addr) der IPAddr-Instanz (Adresse, die an serialize_ipaddr übergeben wurde). Dies ist keine empfohlene Methode (da die Instanzvariablen nicht Teil der öffentlichen API der Klassen sind, aber hier ist es besser, als die Zeichenfolge nach meiner Meinung aus #inspect zu analysieren.
So ist der Prozess wie folgt:
BEARBEITEN: Erklärung wurde der Implementierung hinzugefügt, wie von NathanOliver
gefordert