上周末突然临时通知需要上课,并且似乎要在两天完成并进行答辩,还好小组有大佬,我只负责代码实现这块。
我对校验和并不熟悉,所以第一天上午无从下手,本想着用ChatGPT帮我完成作业,不过很不顺利,它的报错比我吃的饭还多。于是我打开了优快云,打算在上面借鉴一下大佬的算法,哪种语言实现我们这一课程并无要求,不过我最后找到的是Java语言,所以此篇文章就以Java来实现(其实只是在大佬的代码上做了一些修改)
要写代码,就需要知道整个流程思路,所以我在优快云上找到了个人认为能够最快理解校验和计算步骤的文章。
好了,学会了校验和的计算后,我觉得我能够通过自己的能力来实现这部分代码,刚打开Idea,我就发现因为好久没有敲代码,整个语言的使用就没有那么流畅,或者说是就像刚开始学习Java一样,连Java类都无法第一时间去创建,因此我在优快云上继续寻找有没有大佬已经发表过文章了,运气不错,找到了一个大佬的文章,这也是待会的正题,我会在大佬的代码基础上进行修改(由高级改向低级)
原本是想直接Copy此位大佬的文章,并直接作为作业上交,但小组里的大佬说,不能和这个相似,最起码他的是有可视化的窗口进行输入计算的,那我们就直接简化点,做一个在Idea程序台输入数据后再计算校验和的程序,这样就不会重复了。说干就干,对于修改程序代码我还是很擅长的,其主要修改关键点在于[将输入窗口的数据修改成控制台数据,Scanner形式]
这一块就是在控制台输入数据的代码部分,其中标志和偏移位得输入两位数,不然结果会不一样。
Scanner sc =new Scanner(System.in);
System.out.print("请输入版本号:");
String type1=sc.next();
System.out.print("请输入首部长度:");
String HeadLength1=sc.next();
System.out.print("请输入服务类型:");
String SeverType1=sc.next();
SeverType1 = flags_change(SeverType1);
Sum[0] = Integer.parseInt(Connecting(type1,HeadLength1,SeverType1),16);
System.out.print("请输入总长度:");
String AllLength1=sc.next();
String AllLength2 = encodeHEX(Integer.parseInt(AllLength1));//读取总长度,并转换成字符串形式的16进制
Sum[1] = Integer.parseInt(AllLength2,16);
System.out.print("请输入标识:");
String Mark1=sc.next();
String Mark2 = encodeHEX(Integer.parseInt(Mark1));//读取标识,并转换成字符串形式的16进制
Sum[2] = Integer.parseInt(Mark2,16);
System.out.print("请输入标志:");
String Sign1=sc.next();
System.out.print("请输入偏位移:");
String Offset1=sc.next();
Sum[3] = Integer.parseInt(Connecting(Sign1,Offset1,null),16);//将标志与偏位移连接
System.out.print("请输入生存时间:");
String TTL1=sc.next();
String TTL2 = encodeHEX(Integer.parseInt(TTL1));
System.out.print("请输入协议(大写)[ICMP,IGMP,GGP,IP,TCP,EGP,UDP,IGRP,OSPF]:");
String document1=sc.next();
document1 = Choose(document1);
Sum[4] = Integer.parseInt(Connecting(TTL2,document1,null),16);
这一块是分段输入IP地址,但是这样显得比较麻烦,所以下面会采用一次性输入方式。
System.out.print("请输入源IP地址1:");
String S_IP_add1=sc.next();
System.out.print("请输入源IP地址2:");
String S_IP_add2=sc.next();
System.out.print("请输入源IP地址3:");
String S_IP_add3=sc.next();
System.out.print("请输入源IP地址4:");
String S_IP_add4=sc.next();
System.out.print("请输入目的IP地址1:");
String T_IP_add1=sc.next();
System.out.print("请输入目的IP地址2:");
String T_IP_add2=sc.next();
System.out.print("请输入目的IP地址3:");
String T_IP_add3=sc.next();
System.out.print("请输入目的IP地址4:");
String T_IP_add4=sc.next();
boolean judge1 = judge_ip(S_IP_add1)||judge_ip(S_IP_add2)||judge_ip(S_IP_add3)||judge_ip(S_IP_add4)
||judge_ip(T_IP_add1)||judge_ip(T_IP_add2)||judge_ip(T_IP_add3)||judge_ip(T_IP_add4);
if(judge1 == true) JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
String S_IP1 = Length(encodeHEX(Integer.parseInt(S_IP_add1)));
String S_IP2 = Length(encodeHEX(Integer.parseInt(S_IP_add2)));
String S_IP3 = Length(encodeHEX(Integer.parseInt(S_IP_add3)));
String S_IP4 = Length(encodeHEX(Integer.parseInt(S_IP_add4)));
String T_IP1 = Length(encodeHEX(Integer.parseInt(T_IP_add1)));
String T_IP2 = Length(encodeHEX(Integer.parseInt(T_IP_add2)));
String T_IP3 = Length(encodeHEX(Integer.parseInt(T_IP_add3)));
String T_IP4 = Length(encodeHEX(Integer.parseInt(T_IP_add4)));
//判断有没有不合法的输入
boolean judge = Judge(S_IP_add1)&&Judge(S_IP_add2)&&Judge(S_IP_add3)&&Judge(S_IP_add4)
&&Judge(T_IP_add1)&&Judge(T_IP_add2)&&Judge(T_IP_add3)&&Judge(T_IP_add4);
if(judge == false) JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
/*Sum[5] = Integer.parseInt(Connecting(S_IP1,S_IP2,null),16);
Sum[6] = Integer.parseInt(Connecting(S_IP3,S_IP4,null),16);
Sum[7] = Integer.parseInt(Connecting(T_IP1,T_IP2,null),16);
Sum[8] = Integer.parseInt(Connecting(T_IP3,T_IP4,null),16);
这一部分就是源IP地址和目的IP地址一次性输入,通过数组形式保存每一段的数字串,并且把判断加载其中了。
System.out.print("请输入源IP地址:");
String S_IP = sc.next();
String[] S_IP_octets = S_IP.split("\\.");
if (S_IP_octets.length != 4) {
JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
return;
}
for (int i = 0; i < 4; i++) {
if (!Judge(S_IP_octets[i])) {
JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
return;
}
}
String S_IP1 = Length(encodeHEX(Integer.parseInt(S_IP_octets[0])));
String S_IP2 = Length(encodeHEX(Integer.parseInt(S_IP_octets[1])));
String S_IP3 = Length(encodeHEX(Integer.parseInt(S_IP_octets[2])));
String S_IP4 = Length(encodeHEX(Integer.parseInt(S_IP_octets[3])));
Sum[5] = Integer.parseInt(Connecting(S_IP1, S_IP2, null), 16);
Sum[6] = Integer.parseInt(Connecting(S_IP3, S_IP4, null), 16);
System.out.print("请输入目的IP地址:");
String T_IP = sc.next();
String[] T_IP_octets = T_IP.split("\\.");
if (T_IP_octets.length != 4) {
JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
return;
}
for (int i = 0; i < 4; i++) {
if (!Judge(T_IP_octets[i])) {
JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
return;
}
}
String T_IP1 = Length(encodeHEX(Integer.parseInt(T_IP_octets[0])));
String T_IP2 = Length(encodeHEX(Integer.parseInt(T_IP_octets[1])));
String T_IP3 = Length(encodeHEX(Integer.parseInt(T_IP_octets[2])));
String T_IP4 = Length(encodeHEX(Integer.parseInt(T_IP_octets[3])));
Sum[7] = Integer.parseInt(Connecting(T_IP1, T_IP2, null), 16);
Sum[8] = Integer.parseInt(Connecting(T_IP3, T_IP4, null), 16);
以上就是修改的主要几个部分的代码了。其他的和大佬的文章中的代码相同,可以直接借鉴,也可以直接看下面完整的代码段。
package ipadd;
import javax.swing.*;
import java.util.Scanner;
public class ipadd {
public static void Calculation(){
int[] Sum = new int[9];
Scanner sc =new Scanner(System.in);
System.out.print("请输入版本号:");
String type1=sc.next();
System.out.print("请输入首部长度:");
String HeadLength1=sc.next();
System.out.print("请输入服务类型:");
String SeverType1=sc.next();
SeverType1 = flags_change(SeverType1);
Sum[0] = Integer.parseInt(Connecting(type1,HeadLength1,SeverType1),16);
System.out.print("请输入总长度:");
String AllLength1=sc.next();
String AllLength2 = encodeHEX(Integer.parseInt(AllLength1));//读取总长度,并转换成字符串形式的16进制
Sum[1] = Integer.parseInt(AllLength2,16);
System.out.print("请输入标识:");
String Mark1=sc.next();
String Mark2 = encodeHEX(Integer.parseInt(Mark1));//读取标识,并转换成字符串形式的16进制
Sum[2] = Integer.parseInt(Mark2,16);
System.out.print("请输入标志:");
String Sign1=sc.next();
System.out.print("请输入偏位移:");
String Offset1=sc.next();
Sum[3] = Integer.parseInt(Connecting(Sign1,Offset1,null),16);//将标志与偏位移连接
System.out.print("请输入生存时间:");
String TTL1=sc.next();
String TTL2 = encodeHEX(Integer.parseInt(TTL1));
System.out.print("请输入协议(大写)[ICMP,IGMP,GGP,IP,TCP,EGP,UDP,IGRP,OSPF]:");
String document1=sc.next();
document1 = Choose(document1);
Sum[4] = Integer.parseInt(Connecting(TTL2,document1,null),16);
System.out.print("请输入源IP地址:");
String S_IP = sc.next();
String[] S_IP_octets = S_IP.split("\\.");
if (S_IP_octets.length != 4) {
JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
return;
}
for (int i = 0; i < 4; i++) {
if (!Judge(S_IP_octets[i])) {
JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
return;
}
}
String S_IP1 = Length(encodeHEX(Integer.parseInt(S_IP_octets[0])));
String S_IP2 = Length(encodeHEX(Integer.parseInt(S_IP_octets[1])));
String S_IP3 = Length(encodeHEX(Integer.parseInt(S_IP_octets[2])));
String S_IP4 = Length(encodeHEX(Integer.parseInt(S_IP_octets[3])));
Sum[5] = Integer.parseInt(Connecting(S_IP1, S_IP2, null), 16);
Sum[6] = Integer.parseInt(Connecting(S_IP3, S_IP4, null), 16);
System.out.print("请输入目的IP地址:");
String T_IP = sc.next();
String[] T_IP_octets = T_IP.split("\\.");
if (T_IP_octets.length != 4) {
JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
return;
}
for (int i = 0; i < 4; i++) {
if (!Judge(T_IP_octets[i])) {
JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
return;
}
}
String T_IP1 = Length(encodeHEX(Integer.parseInt(T_IP_octets[0])));
String T_IP2 = Length(encodeHEX(Integer.parseInt(T_IP_octets[1])));
String T_IP3 = Length(encodeHEX(Integer.parseInt(T_IP_octets[2])));
String T_IP4 = Length(encodeHEX(Integer.parseInt(T_IP_octets[3])));
Sum[7] = Integer.parseInt(Connecting(T_IP1, T_IP2, null), 16);
Sum[8] = Integer.parseInt(Connecting(T_IP3, T_IP4, null), 16);
/*System.out.print("请输入源IP地址1:");
String S_IP_add1=sc.next();
System.out.print("请输入源IP地址2:");
String S_IP_add2=sc.next();
System.out.print("请输入源IP地址3:");
String S_IP_add3=sc.next();
System.out.print("请输入源IP地址4:");
String S_IP_add4=sc.next();
System.out.print("请输入目的IP地址1:");
String T_IP_add1=sc.next();
System.out.print("请输入目的IP地址2:");
String T_IP_add2=sc.next();
System.out.print("请输入目的IP地址3:");
String T_IP_add3=sc.next();
System.out.print("请输入目的IP地址4:");
String T_IP_add4=sc.next();
boolean judge1 = judge_ip(S_IP_add1)||judge_ip(S_IP_add2)||judge_ip(S_IP_add3)||judge_ip(S_IP_add4)
||judge_ip(T_IP_add1)||judge_ip(T_IP_add2)||judge_ip(T_IP_add3)||judge_ip(T_IP_add4);
if(judge1 == true) JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");
String S_IP1 = Length(encodeHEX(Integer.parseInt(S_IP_add1)));
String S_IP2 = Length(encodeHEX(Integer.parseInt(S_IP_add2)));
String S_IP3 = Length(encodeHEX(Integer.parseInt(S_IP_add3)));
String S_IP4 = Length(encodeHEX(Integer.parseInt(S_IP_add4)));
String T_IP1 = Length(encodeHEX(Integer.parseInt(T_IP_add1)));
String T_IP2 = Length(encodeHEX(Integer.parseInt(T_IP_add2)));
String T_IP3 = Length(encodeHEX(Integer.parseInt(T_IP_add3)));
String T_IP4 = Length(encodeHEX(Integer.parseInt(T_IP_add4)));
//判断有没有不合法的输入
boolean judge = Judge(S_IP_add1)&&Judge(S_IP_add2)&&Judge(S_IP_add3)&&Judge(S_IP_add4)
&&Judge(T_IP_add1)&&Judge(T_IP_add2)&&Judge(T_IP_add3)&&Judge(T_IP_add4);*//*
if(judge == false) JOptionPane.showMessageDialog(null, "地址输入不合法!请重新输入");*/
/*Sum[5] = Integer.parseInt(Connecting(S_IP1,S_IP2,null),16);
Sum[6] = Integer.parseInt(Connecting(S_IP3,S_IP4,null),16);
Sum[7] = Integer.parseInt(Connecting(T_IP1,T_IP2,null),16);
Sum[8] = Integer.parseInt(Connecting(T_IP3,T_IP4,null),16);*/
String SUM = count(Sum);
if(SUM.length()>4) {//若字长大于4位,则进行进位,将最高位加到最低位
String s = SUM.substring(SUM.length()-4);
String a = SUM.substring(0,1);
int i = Integer.parseInt(s,16);
int j = Integer.parseInt(a,16);
SUM = encodeHEX(i+j);
}
SUM = qufan(SUM);
System.out.print("0x"+SUM);
}
public static String flags_change(String a) {
String b = null;
if(a.equals("000" )) b = "00";
else if(a.equals("001")) b = "01";
else if(a.equals("010")) b = "02";
else if(a.equals("011")) b = "03";
else if(a.equals("100")) b = "04";
else if(a.equals("101")) b = "05";
else if(a.equals("110")) b = "06";
else if(a.equals("111")) b = "07";
return b;
}
public static String Connecting(String a, String b, String c) {
String d;
if(c != null) {
d = a+b+c;
}else {
d = a+b;
}
return d;
}
public static String encodeHEX(int numb) { //注意,这里再写count函数时添加了一个静态,如果出现bug把静态删掉!!!
String hex= Integer.toHexString(numb);
return hex;
}
public static String count(int[] a) {
int sum = 0;
String end;
for(int i = 0;i < 9;i++) {
sum += a[i];
}
end = encodeHEX(sum);
return end;
}
public static String Length(String a) {
String b = null;
if(a.length()==1) b = "0" + a;
else if(a.length() == 2) b = a;
return b;
}
public static String qufan(String a) {
String m;
int i,j = 0xffff;
i = Integer.parseInt(a,16);
m = encodeHEX(j-i);
return m;
}
public static String Choose(String a) {
String b = null;
if(a.equals("ICMP" )) b = "01";
else if(a.equals("IGMP")) b = "02";
else if(a.equals("GGP")) b = "03";
else if(a.equals("IP")) b = "04";
else if(a.equals("TCP")) b = "06";
else if(a.equals("EGP")) b = "08";
else if(a.equals("UDP")) b = "17";
else if(a.equals("IGPR")) b = "88";
else if(a.equals("OSPF")) b = "89";
return b;
}
public static boolean Judge(String a) {
int b = Integer.parseInt(a);
if(b>=0&&b<=255) return true;
else return false;
}
public static boolean judge_ip(String a) {
boolean b = null != null;
for(int i=0 ; i<a.length() ; i++){
if(Character.isLetter(a.charAt(i))) b = true;//用char包装类中的判断字母的方法判断每一个字符
else b = false;
}
return b;
}
public static void main(String[] args){
Calculation();
}
}
本文介绍了作者如何利用Java在优快云上找到的算法实现IP首部校验和的计算,通过控制台接收用户输入,简化了原程序的可视化窗口,处理了输入验证和数据转换,最终完成了作业要求的功能。
4653





