Che dấu một địa chỉ IP và phát sóng


12

Lý lịch

Lấy cảm hứng từ câu hỏi Unix.SE này (và tất nhiên là câu trả lời của riêng tôi ).

Khi một địa chỉ IP được chỉ định cho một giao diện, nó thường được cung cấp ở dạng thập phân rải rác này:

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

nơi a.b.c.dlà địa chỉ thực tế và e.f.g.hlà mặt nạ mạng.

Netmask, khi được biểu diễn dưới dạng nhị phân, về cơ bản là một bó 1bit theo sau là một bó 0bit. Khi netmask được bit ANDed theo địa chỉ IP đã cho, kết quả sẽ là phần mạng của địa chỉ hoặc đơn giản là địa chỉ mạng . Điều này sẽ được lập trình vào bảng lộ trình của máy chủ để chủ nhà biết gửi bất kỳ thứ gì dành cho mạng này ra ngoài giao diện này.

Địa chỉ quảng bá cho mạng được lấy bằng cách lấy địa chỉ mạng (từ phía trên) và đặt tất cả các bit máy chủ thành 1. Địa chỉ quảng bá được sử dụng để gửi đến tất cả các địa chỉ trong mạng đã cho.

Thử thách

Cho một địa chỉ IP thập phân rải rác và netmask hợp lệ làm đầu vào, cung cấp địa chỉ mạng và địa chỉ quảng bá làm đầu ra, cũng ở định dạng thập phân rải rác.

  • Đầu vào phải là địa chỉ và mặt nạ dưới dạng hai chuỗi ở định dạng thập phân rải rác. Bạn có thể chuyển chuỗi này thành 2 chuỗi riêng biệt, dưới dạng danh sách hoặc mảng gồm 2 phần tử chuỗi hoặc một chuỗi có địa chỉ và mặt nạ được phân tách bằng một số dấu tách hợp lý.
  • Định dạng đầu ra phải chịu các ràng buộc tương tự như định dạng đầu vào.

Ví dụ

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
Netmask sẽ chỉ có 255 và 0?
xnor

1
@xnor Ví dụ cuối cùng có 252trong đó.
dùng81655

2
Không nên là đầu ra cuối cùng 10.24.0.0 10.27.255.255?
PurkkaKoodari

2
@ Pietu1998 không, 255.252.0.0 là mặt nạ hợp lệ. Trong nhị phân, nó là 11111111.11111100.00000000.00000000
Chấn thương kỹ thuật số

2
@ Pietu1998 Oh yeah - xin lỗi - giờ đã được sửa.
Chấn thương kỹ thuật số

Câu trả lời:


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

Giải trình

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

Kiểm tra


4

MATL , 47 byte

Câu trả lời này sử dụng phiên bản hiện tại (4.0.0) của ngôn ngữ.

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

Thí dụ

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

Giải trình

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

Với đầu vào bằng $ 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";

Và một phiên bản dễ đọc hơn:

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_filteryêu cầu một câu lệnh trong mẫu thay thế khi sử dụng ecờ, vì vậy tôi 'nối' kết quả của các phép tính với giá trị thứ 5 và cao hơn của $ a, bởi vì các giá trị này không bao giờ được sử dụng lại.


0

Perl, 90 85 byte

bao gồm +6 cho -pF/\D/

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

Sử dụng:

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

Dễ đọc hơn:

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

Việc -F/\D/phân tách đầu vào trên các chữ số không và lưu nó vào @F.


0

Yếu tố, 103 byte

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

Đẹp.

Ung dung:

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

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

Là một độc lập, đầu vào là thông qua dòng lệnh:

$ php ip.php 192.168.0.1 255.255.255.0
192.168.0.0 192.168.0.255

Hãy thử trực tuyến!

Hoặc là một hàm, 80 byte :

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

Hãy thử trực tuyến!

Ung dung

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 có các hàm dựng sẵn đẹp (mặc dù có tên hàm dài) để xử lý chuỗi rải rác IPv4 thành nhị phân và ngược lại.

Đầu ra

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.