- 论坛徽章:
- 0
|
用perl给你写了一个,代码如下
- #!/usr/bin/perl
- use strict;
- sub main
- {
- my $ipaddr = "0.0.0.0";
- my $old_ip = "0.0.0.0";
- open(F, "ip_list.txt");
- while (<F>)
- {
- my $line = $_;
- chomp($line);
- my @data = split(/\//, $line);
- my @ip = ipaddressCalc($data[0], bit2mask($data[1]));
-
- if (testIpNext($old_ip, $ip[0]) == 0)
- {
- if ($ipaddr ne "0.0.0.0")
- {
- print "$ipaddr/" . calcBit($ipaddr, $old_ip) . "\n";
- }
-
- $ipaddr = $ip[0];
- }
- $old_ip = $ip[1];
- }
- if ($ipaddr ne "0.0.0.0")
- {
- print "$ipaddr/" . calcBit($ipaddr, $old_ip) . "\n";
- }
- close(F);
- }
- sub ipaddressCalc
- {
- my ($ip, $mask) = @_;
- my $netip = "";
- my $broadcastip = "";
- my @splitIp = split(/\./, $ip);
- my @splitMask = split(/\./, $mask);
- for (my $i = 0; $i < 4; $i++)
- {
- $netip .= $splitMask[$i] == 255 ? $splitIp[$i] : ($splitIp[$i] & $splitMask[$i]);
- $broadcastip .= $splitMask[$i] == 255 ? $splitIp[$i] : (255 - $splitMask[$i]) + ($splitIp[$i] & $splitMask[$i]);
-
- if ($i != 3)
- {
- $netip .= ".";
- $broadcastip .= ".";
- }
- }
- return $netip, $broadcastip;
- }
- sub bit2mask
- {
- my ($bit) = shift;
- my $str_bit = 1 x $bit . 0 x (32 - $bit);
- my $mask = "";
- for (my $i = 0; $i < 4; $i++)
- {
- my $segment = substr($str_bit, $i*8, 8);
- $segment =~ s/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)/$1*128+$2*64+$3*32+$4*16+$5*8+$6*4+$7*2+$8*1/;
- $mask .= $mask eq "" ? eval("$segment") : "." . eval("$segment");
- }
- return $mask;
- }
- sub calcBit
- {
- my ($b_addr, $e_addr) = @_;
- my @b_addrs = split(/\./, $b_addr);
- my @e_addrs = split(/\./, $e_addr);
- my $b_bin = sprintf("%08b%08b%08b%08b", $b_addrs[0], $b_addrs[1], $b_addrs[2], $b_addrs[3]);
- my $e_bin = sprintf("%08b%08b%08b%08b", $e_addrs[0], $e_addrs[1], $e_addrs[2], $e_addrs[3]);
- my $bit = 0;
- for (my $i = 0; $i < 32; $i++)
- {
- return $bit if (substr($b_bin, $i, 1) != substr($e_bin, $i, 1));
- $bit++;
- }
- return 32;
- }
- sub testIpNext
- {
- my ($f_ip, $n_ip) = @_;
- my @f_ips = split(/\./, $f_ip);
- my @n_ips = split(/\./, $n_ip);
- my $flag = 1;
-
- for (my $i = 3; $i >= 0; $i--)
- {
- if ($flag == 1 and ($f_ips[$i] + 1) > 255)
- {
- $flag = 1;
- $f_ips[$i] = 0;
- }
- elsif ($flag == 1 and ($f_ips[$i] + 1) <= 255)
- {
- $flag = 0;
- $f_ips[$i] += 1;
- }
- }
- return 1 if (sprintf("%03d%03d%03d%03d", @f_ips) == sprintf("%03d%03d%03d%03d", @n_ips));
- return 0;
- }
- main();
复制代码
其中ip_list.txt是你保存ip列表的文件名
[ 本帖最后由 slash001 于 2006-4-13 15:15 编辑 ] |
评分
-
查看全部评分
|