Maskieren Sie eine IP-Adresse und geben Sie ihre Sendung an

12

Hintergrund

Inspiriert von dieser Unix.SE-Frage (und natürlich meiner eigenen Antwort ).

Wenn eine IP-Adresse für eine Schnittstelle angegeben wird, wird diese häufig in dieser Punkt-Dezimal-Form angegeben:

a.b.c.d e.f.g.h

Wo a.b.c.dist die tatsächliche Adresse und e.f.g.hist die Netzmaske.

Die Netzmaske ist, wenn sie binär dargestellt wird, im Grunde eine Reihe von 1Bits, gefolgt von einer Reihe von 0Bits. Wenn die Netzmaske gegen die angegebene IP-Adresse bitweise UND-verknüpft ist, ist das Ergebnis der Netzwerkteil der Adresse oder einfach die Netzwerkadresse . Dies wird in die Routentabelle des Hosts programmiert, damit der Host weiß, dass alles, was für dieses Netzwerk bestimmt ist, über diese Schnittstelle gesendet wird.

Die Broadcast-Adresse für ein Netzwerk wird abgeleitet, indem die Netzwerkadresse (von oben) genommen und alle Host-Bits auf 1 gesetzt werden. Die Broadcast-Adresse wird zum Senden an alle Adressen innerhalb des angegebenen Netzwerks verwendet.

Herausforderung

Geben Sie bei einer IP-Adresse mit gepunkteter Dezimalstelle und einer gültigen Netzmaske als Eingabe die Netzwerkadresse und die Broadcast-Adresse als Ausgabe an, ebenfalls im Punkt-Dezimal-Format.

  • Die Eingabe muss Adresse und Maske als zwei Zeichenfolgen im Punkt-Dezimal-Format sein. Sie können dies als 2 separate Zeichenfolgen, als Liste oder Array von 2 Zeichenfolgenelementen oder als einzelne Zeichenfolge übergeben, wobei Adresse und Maske durch ein sinnvolles Trennzeichen getrennt sind.
  • Das Ausgabeformat unterliegt denselben Einschränkungen wie das Eingabeformat.

Beispiele

Input                              Output

192.168.0.1 255.255.255.0          192.168.0.0 192.168.0.255
192.168.0.0 255.255.255.0          192.168.0.0 192.168.0.255
192.168.0.255 255.255.255.0        192.168.0.0 192.168.0.255
100.200.100.200 255.255.255.255    100.200.100.200 100.200.100.200
1.2.3.4 0.0.0.0                    0.0.0.0 255.255.255.255
10.25.30.40 255.252.0.0            10.24.0.0 10.27.255.255
Digitales Trauma
quelle
2
Wird die Netzmaske nur 255s und 0s haben?
xnor
1
@xnor Das letzte Beispiel enthält 252.
user81655
2
Sollte nicht die letzte Ausgabe sein 10.24.0.0 10.27.255.255?
PurkkaKoodari
2
@ Pietu1998 no, 255.252.0.0 ist eine gültige Maske. In binären ist es 11111111.11111100.00000000.00000000
Digital Trauma
2
@ Pietu1998 Oh ja - sorry - es ist jetzt behoben.
Digitales Trauma

Antworten:

5

JavaScript (ES6), 92 Byte

(a,m)=>a.split`.`.map((n,i)=>(v=m[i],m[i]=n&v|v^255,n&v),m=m.split`.`).join`.`+" "+m.join`.`

Erläuterung

(a,m)=>
  a.split`.`
  .map((n,i)=>(
      v=m[i],
      m[i]=n&v|v^255,
      n&v
    ),
    m=m.split`.`
  ).join`.`
  +" "+m.join`.`

Prüfung

user81655
quelle
4

MATL , 47 Bytes

Diese Antwort verwendet die aktuelle Version (4.0.0) der Sprache.

'%i.%i.%i.%i't32whh2:"j'\d+'XXU]tbZ&tb255Z~+hYD

Beispiel

>> matl
 > '%i.%i.%i.%i't32whh2:"j'\d+'XXU]tbZ&tb255Z~+hYD
 > 
> 192.168.0.1
> 255.255.255.0
192.168.0.0 192.168.0.255

Erläuterung

'%i.%i.%i.%i't32whh      % format string: '%i.%i.%i.%i %i.%i.%i.%i'
2:"                      % for loop: do this twice
    j'\d+'XXU            % input string and parse into 4-vector with the numbers
]                        % end
tbZ&                     % compute network address
tb255Z~+                 % compute broadcast address
hYD                      % concatenate into 8-vector and apply format string
Luis Mendo
quelle
0

PHP, 126 Bytes

Mit Eingabe in $ n:

preg_filter(~Ð×£ÔÖÐ,~Û¤¢Â×ÛÎÖÑ×ÛÔÔÁÌÀ×ÛÑÂ×ÛÂÛÁÊÀÝÑÝÅÝÝÖÑ×Û¤ÛÒÊ¢ÙÛÎÖÖÑ×ÛÑÂÛÑ×Û¤ÛÒÊ¢ÍÊÊÙÛÎÖÖÅÝÝÖ,$n);echo"$c $b";

Hexdump:

0000000: 7072 6567 5f66 696c 7465 7228 7ed0 d7a3  preg_filter(~...
0000010: 9bd4 d6d0 9a2c 7edb 9ea4 a2c2 d7db ced6  .....,~.........
0000020: d1d7 db96 d4d4 c1cc c0d7 db9c d1c2 d7db  ................
0000030: 8bc2 db96 c1ca c0dd d1dd c5dd ddd6 d1d7  ................
0000040: db9e a4db 96d2 caa2 d9db ced6 d6d1 d7db  ................
0000050: 9dd1 c2db 8bd1 d7db 9ea4 db96 d2ca a283  ................
0000060: cdca cad9 81db ced6 d6c5 dddd d62c 246e  .............,$n
0000070: 293b 6563 686f 2224 6320 2462 223b       );echo"$c $b";

Und eine besser lesbare Version:

preg_filter( /* PCRE regex on input */
    '/(\d+)/e', /* match all digits, execute the code for each one */
    '$a[]=($1) /* push the matched value to the array $a */
        .($i++>3 /* if we're at the 5th or higher digit */
            ?($c.=($t=$i>5?".":"").($a[$i-5]&$1)) /* append to $c bitwise AND-ed number */
                .($b.=$t.($a[$i-5]|255&~$1)) /* append to $b the broadcast address */
            :"")',
    $n);
echo"$c $b"; /* output $c and $b */

preg_filtererfordert eine einzelne Anweisung im Ersetzungsmuster, wenn das eFlag verwendet wird, daher füge ich das Ergebnis der Berechnungen an den 5. und höheren Wert von $ a an, da diese niemals wiederverwendet werden.

Aurel Bílý
quelle
0

Perl, 90 85 Bytes

beinhaltet +6 für -pF/\D/

for(0..3){push@a,$F[$_]&1*($y=$F[$_+4]);push@b,$F[$_]|~$y&255}$"='.';$_="@a @b"

Verwendungszweck:

echo "192.168.0.1 255.255.255.0" | perl -pF/\\D/ file.pl

Besser lesbar:

for(0..3) {
    push @a, $F[$_] & 1*($y=$F[$_+4]);  # calc/add network address 'byte'
    push @b, $F[$_] | ~$y & 255         # calc/add broadcast address 'byte'
}
$"='.';                                 # set $LIST_SEPARATOR
$_="@a @b"                              # set output to network address and broadcast

Das -F/\D/teilt die Eingabe auf nicht-Ziffern auf und speichert sie in @F.

Kenney
quelle
0

Faktor 103 Bytes

[ [ ipv4-aton ] bi@ 2dup bitand -rot dup bit-count 32 - abs on-bits pick bitor 2nip [ ipv4-ntoa ] bi@ ]

Nett.

Ungolfed:

: mask-and-broadcast ( ip mask -- netaddr broadcast )
  [ ipv4-aton ] bi@ 2dup bitand -rot dup bit-count 32 - abs on-bits pick bitor 2nip
  [ ipv4-ntoa ] bi@ ;
Katze
quelle
0

PHP , 74 Bytes

<?=long2ip($i=ip2long($argv[1])&$m=ip2long($argv[2])),' ',long2ip($i|~$m);

Als eigenständige Eingabe erfolgt die Eingabe über die Befehlszeile:

$ php ip.php 192.168.0.1 255.255.255.0
192.168.0.0 192.168.0.255

Probieren Sie es online aus!

Oder als Funktion 80 Bytes :

function($a,$b){return[long2ip($i=ip2long($a)&$m=ip2long($b)),long2ip($i|~$m)];}

Probieren Sie es online aus!

Ungolfed

function ip( $a, $b ) {
    $i = ip2long( $a );          // string IP to 32 bit int
    $m = ip2long( $b );          // string netmask to 32 bit int
    $n = $i & $m;                // network is bitwise AND of IP and netmask
    $c = $i | ~$m;               // broadcast is bitwise OR of IP and inverse netmask
    return [ long2ip( $n ), long2ip( $c ) ];
}

PHP hat nette (wenn auch mit langen Funktionsnamen) integrierte Funktionen, um IPv4-Punktzeichenfolgen in Binärdateien und zurück zu verarbeiten.

Ausgabe

192.168.0.1 255.255.255.0   => 192.168.0.0 192.168.0.255
192.168.0.0 255.255.255.0   => 192.168.0.0 192.168.0.255
192.168.0.255 255.255.255.0 => 192.168.0.0 192.168.0.255
100.200.100.200 255.255.255.255 => 100.200.100.200 100.200.100.200
1.2.3.4 0.0.0.0 => 0.0.0.0 255.255.255.255
10.25.30.40 255.252.0.0 => 10.24.0.0 10.27.255.255
640 KB
quelle