IP 주소를 마스킹하고 브로드 캐스트


12

배경

이 Unix.SE 질문에서 영감을 얻었습니다 (물론 내 자신의 답변 ).

인터페이스에 IP 주소를 지정하면 다음과 같이 점으로 구분 된 십진 형식으로 표시됩니다.

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

여기서 a.b.c.d실제 주소 e.f.g.h는 넷 마스크입니다.

네트 마스크는 2 진으로 표현 될 때 기본적으로 1비트 수 와 비트 수를 나타냅니다 0. 넷 마스크가 주어진 IP 주소에 대해 비트 단위 AND 처리되면 결과는 주소의 네트워크 부분 또는 단순히 네트워크 주소가 됩니다. 이것은 호스트의 라우팅 테이블에 프로그래밍되어 호스트가이 네트워크로 예정된 것을이 인터페이스로 보내도록 알 수 있습니다.

네트워크의 브로드 캐스트 주소는 네트워크 주소 (위에서)를 가져와 모든 호스트 비트를 1로 설정하여 파생됩니다. 브로드 캐스트 주소는 지정된 네트워크 내의 모든 주소 로 전송하는 데 사용됩니다 .

도전

점으로 구분 된 십진 IP 주소와 입력으로 유효한 넷 마스크가 제공되면 점으로 구분 된 십진 형식으로 네트워크 주소와 브로드 캐스트 주소를 출력으로 제공하십시오.

  • 입력은 점으로 구분 된 십진 형식의 두 문자열로 주소와 마스크 여야합니다. 이것을 2 개의 문자열 요소의 목록 또는 배열 또는 주소와 마스크가있는 구분 기호로 구분 된 단일 문자열로 2 개의 개별 문자열로 전달할 수 있습니다.
  • 출력 형식은 입력 형식과 동일한 제약 조건을 따릅니다.

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

2
넷 마스크에는 255와 0 만 있습니까?
xnor

1
@xnor 마지막 ​​예제가 252있습니다.
user81655

2
마지막 출력이 아니어야합니까 10.24.0.0 10.27.255.255?
PurkkaKoodari

2
@ Pietu1998 no, 255.252.0.0은 유효한 마스크입니다. 이진에서는 11111111.11111100.00000000.00000000
Digital Trauma

2
@ Pietu1998 오 예-죄송합니다-이제 해결되었습니다.
Digital Trauma

답변:


5

자바 스크립트 (ES6), 92 바이트

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

설명

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

테스트


4

MATL , 47 바이트

이 답변은 현재 버전 (4.0.0) 의 언어를 사용합니다.

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

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

설명

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


0

PHP, 126 바이트

$ n의 입력으로 :

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

16 진 덤프 :

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

그리고 더 읽기 쉬운 버전 :

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_filtere플래그를 사용할 때 대체 패턴에 단일 문이 필요 하므로 계산 결과를 재사용하지 않기 때문에 계산 결과를 $ a의 5 이상 값에 '추가'합니다.


0

펄, 90 85 바이트

+6 포함 -pF/\D/

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

용법:

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

더 읽기 쉬운 :

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/그 비 숫자 및 점포의 입력을 분리한다 @F.


0

팩터, 103 바이트

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

좋은.

언 골프 드 :

: 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@ ;

0

PHP , 74 바이트

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

독립형으로 입력은 명령 행을 통해 이루어집니다.

$ php ip.php 192.168.0.1 255.255.255.0
192.168.0.0 192.168.0.255

온라인으로 사용해보십시오!

또는 함수로 80 바이트 :

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

온라인으로 사용해보십시오!

언 골프

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는 IPv4 점으로 묶은 문자열을 이진 및 그 이상으로 처리 할 수있는 멋진 기능을 갖추고 있지만 내장되어 있습니다.

산출

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.