Zamaskuj adres IP i nadaj go

12

tło

Inspirowane tym pytaniem Unix.SE (i oczywiście moją własną odpowiedzią ).

Gdy adres IP jest określony dla interfejsu, jest on często podawany w postaci dziesiętnej z kropkami:

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

gdzie a.b.c.djest rzeczywisty adres i e.f.g.hmaska ​​sieci.

Maska sieci, gdy jest reprezentowana w postaci binarnej, jest w zasadzie wiązką 1bitów, po której następuje wiązka 0bitów. Gdy maska ​​sieci jest bitowo ANDowana względem podanego adresu IP, wynikiem będzie część sieciowa adresu lub po prostu adres sieciowy . Zostanie to zaprogramowane w tablicy tras hosta, aby host wiedział, że może wysłać wszystko przez sieć do tego interfejsu.

Adres rozgłoszeniowy dla sieci jest uzyskiwany poprzez pobranie adresu sieciowego (z góry) i ustawienie wszystkich bitów hosta na 1. Adres rozgłoszeniowy służy do wysyłania na wszystkie adresy w obrębie danej sieci.

Wyzwanie

Biorąc pod uwagę adres IP z kropkami dziesiętnymi i prawidłową maskę sieci jako dane wejściowe, podaj adres sieci i adres rozgłoszeniowy jako dane wyjściowe, również w formacie kropkowo-dziesiętnym.

  • Dane wejściowe muszą być adresem i maską jako dwa ciągi w formacie kropkowo-dziesiętnym. Możesz przekazać to jako 2 oddzielne ciągi, jako listę lub tablicę 2 elementów ciągowych lub pojedynczy ciąg z adresem i maską oddzielonymi rozsądnym separatorem.
  • Format wyjściowy podlega takim samym ograniczeniom jak format wejściowy.

Przykłady

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
Cyfrowa trauma
źródło
2
Czy maska ​​sieci będzie miała tylko 255 i 0?
xnor
1
@xnor Ostatni przykład ma 252w sobie.
user81655,
2
Czy nie powinno być ostatnie wyjście 10.24.0.0 10.27.255.255?
PurkkaKoodari,
2
@ Pietu1998 nie, 255.252.0.0 jest poprawną maską. W systemie dwójkowym jest to 11111111.11111100.00000000.00000000
Cyfrowa trauma
2
@ Pietu1998 O tak - przepraszam - teraz naprawione.
Cyfrowy uraz

Odpowiedzi:

5

JavaScript (ES6), 92 bajty

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

Wyjaśnienie

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

Test

użytkownik 81655
źródło
4

MATL , 47 bajtów

Ta odpowiedź używa bieżącej wersji (4.0.0) języka.

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

Przykład

>> 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

Wyjaśnienie

'%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
źródło
0

PHP, 126 bajtów

Z danymi wejściowymi w $ 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";

I bardziej czytelna wersja:

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_filterwymaga użycia pojedynczej instrukcji we wzorcu zastępowania podczas korzystania z eflagi, więc „dołączam” wynik obliczeń do 5. i wyższych wartości $ a, ponieważ nigdy nie są one ponownie używane.

Aurel Bílý
źródło
0

Perl, 90 85 bajtów

zawiera +6 dla -pF/\D/

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

Stosowanie:

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

Bardziej czytelny:

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

-F/\D/Rozgałęzia zasilanie na nie-cyfr i przechowuje je w @F.

Kenney
źródło
0

Współczynnik, 103 bajty

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

Ładny.

Nie golfowany:

: 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@ ;
kot
źródło
0

PHP , 74 bajty

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

W trybie autonomicznym dane wejściowe są wprowadzane za pomocą wiersza polecenia:

$ php ip.php 192.168.0.1 255.255.255.0
192.168.0.0 192.168.0.255

Wypróbuj online!

Lub jako funkcja 80 bajtów :

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

Wypróbuj online!

Nie golfił

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 ma ładne (aczkolwiek z długimi nazwami funkcji) wbudowane funkcje do obsługi kropkowanego ciągu IPv4 na binarny iz powrotem.

Wynik

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
źródło