หน้ากากที่อยู่ IP และให้การออกอากาศ


12

พื้นหลัง

แรงบันดาลใจจากคำถาม Unix.SE นี้ (และแน่นอนคำตอบของฉันเอง )

เมื่อมีการระบุที่อยู่ IP สำหรับอินเทอร์เฟซมักจะได้รับในรูปทศนิยมประ:

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

ที่a.b.c.dอยู่ที่แท้จริงe.f.g.hคือ netmask

netmask เมื่อแสดงเป็นไบนารี่นั้นจะเป็นกลุ่มของ1บิตตามด้วยพวงของ0บิต เมื่อ netmask จะ ANDed ค่าที่เหมาะสมกับที่อยู่ IP ได้รับผลจะเป็นเครือข่ายส่วนของที่อยู่หรือเพียงแค่ที่อยู่เครือข่าย สิ่งนี้จะถูกตั้งโปรแกรมไว้ในตารางเส้นทางของโฮสต์เพื่อให้โฮสต์รู้ว่าจะส่งสิ่งใดก็ตามที่กำหนดไว้สำหรับเครือข่ายนี้จากส่วนต่อประสานนี้

ที่อยู่ออกอากาศสำหรับเครือข่ายนั้นมาจากการใช้ที่อยู่เครือข่าย (จากด้านบน) และตั้งค่าโฮสต์บิตทั้งหมดเป็น 1 ที่อยู่ออกอากาศจะใช้ในการส่งไปยังที่อยู่ทั้งหมดภายในเครือข่ายที่กำหนด

ท้าทาย

เมื่อได้รับที่อยู่ IP แบบจุดทศนิยมและ netmask ที่ถูกต้องเป็นอินพุตให้ที่อยู่เครือข่ายและที่อยู่การออกอากาศเป็นผลลัพธ์เช่นกันในรูปแบบทศนิยมแบบจุด

  • อินพุตต้องเป็นแอดเดรสและมาส์กเป็นสองสตริงในรูปแบบจุดประ คุณอาจผ่านสิ่งนี้เป็น 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
netmask จะมีเพียง 255 และ 0 หรือไม่
xnor

1
@xnor ตัวอย่างสุดท้ายมี252อยู่ในนั้น
user81655

2
ผลลัพธ์สุดท้ายควรเป็น10.24.0.0 10.27.255.255อย่างไร
PurkkaKoodari

2
@ Pietu1998 ไม่ 255.252.0.0 เป็นรูปแบบที่ถูกต้อง ในไบนารีมันคือ 11111111.11111100.00000000.00000000
บาดเจ็บทางดิจิตอล

2
@ Pietu1998 โอ้ใช่ - ขอโทษ - มันคงที่แล้ว
Digital Trauma

คำตอบ:


5

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

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

และเวอร์ชันที่อ่านง่ายขึ้น:

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_filterต้องการคำสั่งเดียวในรูปแบบการแทนที่เมื่อใช้eแฟล็กดังนั้นฉันจะผนวกผลลัพธ์ของการคำนวณไปยังค่าที่ 5 และสูงกว่าของ $ a เนื่องจากสิ่งเหล่านั้นจะไม่ถูกนำมาใช้ซ้ำ


0

Perl, 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@ ]

ดี

Ungolfed:

: 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)];}

ลองออนไลน์!

Ungolfed

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 dotted-string เป็นไบนารี่และแบ็ก

เอาท์พุต

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.