首页 > 其他分享 >【华为OJ18】识别有效的IP地址和掩码并进行分类统计

【华为OJ18】识别有效的IP地址和掩码并进行分类统计

时间:2022-11-22 12:32:16浏览次数:72  
标签:ipFirstPart int IP ++ OJ18 255.255 IP地址 掩码


题目描述


请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。

所有的IP地址划分为 A,B,C,D,E五类

A类地址1.0.0.0~126.255.255.255;

B类地址128.0.0.0~191.255.255.255;

C类地址192.0.0.0~223.255.255.255;

D类地址224.0.0.0~239.255.255.255;

E类地址240.0.0.0~255.255.255.255

私网IP范围是:

10.0.0.0~10.255.255.255

172.16.0.0~172.31.255.255

192.168.0.0~192.168.255.255



子网掩码为前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)



本题暂时默认以0开头的IP地址是合法的,比如0.1.1.2,是合法地址



输入描述:



多行字符串。每行一个IP地址和掩码,用~隔开。



输出描述:



统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。



输入例子:


10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0



输出例子:

1 0 1 0 0 2 1


import java.math.BigInteger;
import java.util.Scanner;
/**
* 题目描述
请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。
所有的IP地址划分为 A,B,C,D,E五类
* @author WGS
*/
public class Main{

private static int a =0;
private static int b =0;
private static int c =0;
private static int d =0;
private static int e =0;
private static int errors =0;
private static int privateIP =0;

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String str=sc.next();
checkIp(str);
}
System.out.println(a+" "+b+" "+c+" "+d+" "+e+" "+errors+" "+privateIP);
sc.close();
}

private static void checkIp(String str) {//str:10.70.44.68~255.254.255.0
String[] s=str.split("~");

String[] ipStr=s[0].split("\\.");//获得IP: 10/70/44/68
String[] maskStr=s[1].split("\\.");//获得掩码:255.254.255.0

//****1 注意!!!错误IP地址或错误掩码的判断一定要放在最前面判断,因为判断出了是错误IP地址或错误掩码后
//就直接return,不用判断是不是后面的ABCDE类或者私有IP *****

//1-1 错误IP
if(ipStr.length!=4 || maskStr.length!=4){
errors++;//错误IP
return;
}
// 判断IP中的每一部分格式
for (int i = 0; i < 4; i++) {
if (" ".equals(ipStr[i]) || " ".equals(maskStr[i])) {
errors++;
return;
}
}

int[] ipInts = new int[4];
int[] maskInts = new int[4];
// 将IP解析成数字
for (int i = 0; i < 4; i++) {
ipInts[i] = Integer.parseInt(ipStr[i]);
maskInts[i] = Integer.parseInt(maskStr[i]);
if (ipInts[i] > 255 || maskInts[i] > 255) {
errors++;
return;
}
}
//1-2 错误掩码:255.255.255.32 必须是前面全为1,后面全为0,即从后往前至少有一位是0,且0前的数字全为1
//即首先得到第一个0的位置,再判断0后是否有1,有即为错误掩码

//将掩码转为为二进制:好判断0,1位置
String tempStr = "";
//例如将255.254.255.0转换成二进制:
//255:1111 1111
//254:1111 1110
//255:1111 1111
// 0:0
for(int i = 0; i<maskInts.length; i++){
String str2 = Integer.toBinaryString( maskInts[i] );
//判断一下:如果转化为二进制为0或者1或者不满8位,要在数后补0
int bit = 8-str2.length();
if(str2.length()<8){
for(int j=0; j<bit; j++){
str2 = "0"+str2;
}
}
tempStr += str2;
}

int indexOfFirstZero = tempStr.indexOf("0");
tempStr = tempStr.substring(indexOfFirstZero + 1);

if(tempStr.contains("1")){
errors++;
return;
}

//获得IP地址第一部分数字
int ipFirstPart=Integer.parseInt(ipStr[0]);
int ipSecondPart = Integer.parseInt(ipStr[1]);


//3 判断ABCDE 类IP 地址
if(ipFirstPart>= 1 && ipFirstPart <= 126 ){
a++;
//2 判断私有IP个数,私有IP和ABCDE 类IP地址判断不冲突,即IP是私有IP一类,也可以是ABCDE一类
if(ipFirstPart == 10){
privateIP++;
}
}
if(ipFirstPart>= 128 && ipFirstPart <= 191 ){
b++;
//2 判断私有IP个数
if(ipFirstPart == 172){
if(ipSecondPart >= 16 && ipSecondPart<= 31){
privateIP++;
}
}
}
if(ipFirstPart>= 192 && ipFirstPart <= 223 ){
c++;
//2 判断私有IP个数
if(ipFirstPart==192){
if(ipSecondPart == 168){
privateIP++;
}
}
}
if(ipFirstPart>= 224 && ipFirstPart <= 239 ){
d++;
}
if(ipFirstPart>= 240 && ipFirstPart <= 255 ){
e++;
}

}

}


标签:ipFirstPart,int,IP,++,OJ18,255.255,IP地址,掩码
From: https://blog.51cto.com/u_15886477/5877694

相关文章

  • Java 网络编程(二)IP地址
    IPIP地址:InetAddress·唯一定位一台主机·127.0.0.1:本机localhost·IP地址分类1.IPv4和IPv6IPv4=>127.0.......
  • IPv4地址和子网掩码
    为什么需要IP地址思考如果2台主机的共有和私有IP地址都是一样的,会出现什么状况?我打开了一个网页,结果服务器发现你的IP地址是刚刚请求网页的地址,就有可能把资源发给你......
  • 4.Ubuntu设置静态IP地址
    Ubuntu 18.04采用netplan来管理网络配置计划,在/etc/netplan/目录下有一个以yaml结尾的文件,设置步骤如下ifconfig查看电脑的网卡信息: route-n命令,打印路由表我这边......
  • ubuntu 16.04配置固定IP地址
    目录​​前言:​​​​1.查看网卡设备:​​​​2.编辑配置文件​​​​3.重启网络​​前言:有时候为了网络通讯方便,我们需要设置通讯方电脑的IP为固定IP,这样不用每次开机之后重......
  • 自定义的Qt IP地址编辑控件
    模仿WIndows系统的IP地址编辑框创建的控件。在VS2015和Qt5.9上测试通过。效果图如下:上代码,头文件:classQLineEdit;classMIpAddressEditor:publicQWidget{Q......
  • PHP获取真实IP地址(获取本地127.0.0.1真实地址)
    PHP获取真实IP地址publicfunctionget_real_ip(){static$realip;if(isset($_SERVER)){if(isset($_SERVER['HTTP_X_FORWARDED_......
  • C# c#中如何获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内
    CIMWin32WMIProvidersWMI是什么Windows管理规范(WindowsManagementInstrumentation)是一项核心的Windows管理技术;用户可以使用WMI管理本地和远程计算机。WMI通过......
  • 一个网卡怎么设置多个IP地址
    我们的网卡上面可以可以设置多个IP地址,主要针对软件测试这些,可以增加IP访问等,我们一起看看怎么设置多个IP。1在电脑的右下角联网的图标,右键选择“打开网络和interner设置......
  • Proxmox Virtual Environment(PVE)完美的更改IP地址 (转载)
    vi/etc/network/interfaces通过键盘上下左右移动到address这行的IP地址,按一次i进入修改状态,修改为新的IP地址,如果需要网关则修改gateway这行,修改完成确认无误后按一次ESC......
  • linux配置固定(静态)IP地址
    第1步:cd /etc/network第2步:sudo vi interfaces第3步:按照下图进行修改,修改完成后切换回命令状态(esc键)输入:wq!离开即可    ......