Netzmaske zu CIDR in Ruby

7

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?

    
Dean Smith 01.12.2009, 12:33
quelle

6 Antworten

11

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%     
YOU 01.12.2009, 13:08
quelle
9

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%     
the Tin Man 07.06.2011 18:15
quelle
4

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.

    
bluefear 30.05.2012 19:36
quelle
4

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%     
Nicolas Ledez 26.10.2012 13:16
quelle
2

Wenn Sie nicht die IP-Adresse gem verwenden müssen, können Sie dies mit dem netaddr Juwel

%Vor%     
Claudio Floreani 25.10.2011 14:52
quelle
1
%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:

  1. Ruft die Instanzvariable @mask_addr ab, die die Netzmaske darstellt
  2. Erhalte seine Binärdarstellung z.B. %Code%
  3. Zählen Sie die 1-s in der Basis-2-Nummer, um die CIDR-Maske (24)
  4. zu erhalten
  5. Erstellen Sie eine Zeichenfolge bestehend aus der Adresse & amp; Maske

BEARBEITEN: Erklärung wurde der Implementierung hinzugefügt, wie von NathanOliver

gefordert     
Madis Nõmme 20.10.2015 09:54
quelle

Tags und Links