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.