Masquer une adresse IP et donner sa diffusion

12

Contexte

Inspiré par cette question Unix.SE (et bien sûr ma propre réponse ).

Lorsqu'une adresse IP est spécifiée pour une interface, elle est souvent donnée sous cette forme décimale à points:

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

a.b.c.dest l'adresse réelle et e.f.g.hle masque de réseau.

Le masque de réseau, lorsqu'il est représenté en binaire, est fondamentalement un tas de 1bits suivi d'un tas de 0bits. Lorsque le masque de réseau est binaire ET par rapport à l'adresse IP donnée, le résultat sera la partie réseau de l'adresse, ou simplement l' adresse réseau . Cela sera programmé dans la table de routage de l'hôte afin que l'hôte sache envoyer tout ce qui est destiné à ce réseau via cette interface.

L'adresse de diffusion pour un réseau est dérivée en prenant l'adresse réseau (ci-dessus) et en définissant tous les bits d'hôte sur 1. L'adresse de diffusion est utilisée pour envoyer à toutes les adresses du réseau donné.

Défi

Étant donné une adresse IP décimale en pointillés et un masque de réseau valide en entrée, fournissez l'adresse réseau et l'adresse de diffusion en sortie, également au format décimal en pointillés.

  • L'entrée doit être adresse et masque sous la forme de deux chaînes au format décimal pointé. Vous pouvez passer ceci comme 2 chaînes distinctes, comme une liste ou un tableau de 2 éléments de chaîne ou une seule chaîne avec l'adresse et le masque séparés par un séparateur sensible.
  • Le format de sortie est soumis aux mêmes contraintes que le format d'entrée.

Exemples

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
Traumatisme numérique
la source
2
Le masque de réseau aura-t-il seulement 255 et 0?
xnor
1
@xnor Le dernier exemple en contient 252.
user81655
2
La dernière sortie ne devrait-elle pas être 10.24.0.0 10.27.255.255?
PurkkaKoodari
2
@ Pietu1998 no, 255.252.0.0 est un masque valide. En binaire, il s'agit de 11111111.11111100.00000000.00000000
Digital Trauma
2
@ Pietu1998 Oh ouais - désolé - c'est réparé maintenant.
Digital Trauma

Réponses:

5

JavaScript (ES6), 92 octets

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

Explication

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

Tester

user81655
la source
4

MATL , 47 octets

Cette réponse utilise la version actuelle (4.0.0) de la langue.

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

Exemple

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

Explication

'%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
la source
0

PHP, 126 octets

Avec entrée en $ 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";

Et une version plus lisible:

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_filternécessite une seule instruction dans le modèle de remplacement lors de l'utilisation du edrapeau, donc j'ajoute le résultat des calculs à la 5e et aux valeurs supérieures de $ a, car celles-ci ne sont jamais réutilisées.

Aurel Bílý
la source
0

Perl, 90 85 octets

comprend +6 pour -pF/\D/

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

Usage:

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

Plus lisible:

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

Le -F/\D/divise l'entrée sur des non-chiffres et la stocke @F.

Kenney
la source
0

Facteur, 103 octets

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

Agréable.

Non golfé:

: 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@ ;
chat
la source
0

PHP , 74 octets

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

En tant que autonome, l'entrée se fait via la ligne de commande:

$ php ip.php 192.168.0.1 255.255.255.0
192.168.0.0 192.168.0.255

Essayez-le en ligne!

Ou en fonction, 80 octets :

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

Essayez-le en ligne!

Non golfé

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 a de jolis (bien qu'avec des noms de fonction longs) intégrés pour gérer la chaîne pointée IPv4 en binaire et inversement.

Production

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 Ko
la source