import java.net.InetAddress;/nimport java.net.UnknownHostException;/nimport java.util.Scanner;/n/npublic class Main {/n/n public static void main(String[] args) {/n System.out.println('请输入一串IP数据包头:');/n System.out.println();/n/n Scanner sc = new Scanner(System.in);/n String packet = sc.nextLine().replace(' ', '');/n sc.close();/n/n try {/n byte[] packetBytes = hexStringToByteArray(packet);/n InetAddress sourceAddress = InetAddress.getByAddress(getSubArray(packetBytes, 12, 16));/n InetAddress targetAddress = InetAddress.getByAddress(getSubArray(packetBytes, 16, 20));/n/n // 版本号:取字节的高4位,并将其转换为十进制数。/n int version = (packetBytes[0] & 0xF0) >> 4;/n // 包头长度:取字节的低4位,并将其乘以4得到包头长度的字节数。/n int headerLength = (packetBytes[0] & 0x0F) * 4;/n // 优先权:取字节的高3位,并将其转换为十进制数。/n int priority = (packetBytes[1] & 0xE0) >> 5;/n // TOS:根据优先权的值确定TOS的具体含义。/n String TOS;/n if ((packetBytes[1] & 0x10) == 0x10) {/n TOS = '最小延迟';/n } else if ((packetBytes[1] & 0x08) == 0x08) {/n TOS = '最大吞吐量';/n } else if ((packetBytes[1] & 0x04) == 0x04) {/n TOS = '最高可靠性';/n } else if ((packetBytes[1] & 0x02) == 0x02) {/n TOS = '低成本';/n } else {/n TOS = '一般服务';/n }/n // IP数据报文总长:取字节的第三和第四个字节,并将其转换为十进制数。/n int packetLength = (packetBytes[2] << 8) + packetBytes[3];/n // 标志位:取字节的第五和第六个字节,并将其转换为十进制数。/n int identification = (packetBytes[4] << 8) + packetBytes[5];/n // 是否分片:根据标志位的第二位判断是否分片。/n String section = ((packetBytes[6] & 0x40) == 0) ? '可以分片' : '不能分片';/n // 包属于:根据标志位的第三位判断包属于哪个分片/n String property = ((packetBytes[6] & 0x20) == 0) ? '最后一个分片的包' : '分片中段的包';/n // 分段偏移:取标志位的第四位到最后一位。/n int fragmentOffset = ((packetBytes[6] & 0x1F) << 8) + packetBytes[7];/n // TTL值:取字节的第八个字节,并将其转换为十进制数。/n int ttl = packetBytes[8] & 0xFF;/n // 协议号:取字节的第九个字节,并将其转换为十进制数。然后根据协议号的值,确定协议的名称。/n int protocolCode = packetBytes[9] & 0xFF;/n String protocol = '未知';/n for (ProtocolType val : ProtocolType.values()) {/n if (val.getValue() == protocolCode) {/n protocol = val.name();/n }/n }/n // 头部校验和:取字节的第十和第十一个字节,并将其转换为十六进制字符串。/n String checkSum = String.format('%02X%02X', packetBytes[10], packetBytes[11]);/n/n // 输出包信息/n println('版本号:');/n println(String.valueOf(version));/n System.out.println();/n/n println('包头长度:');/n println(String.valueOf(headerLength));/n System.out.println();/n/n println('优先权:');/n println(String.valueOf(priority));/n System.out.println();/n/n println('TOS:');/n println(TOS);/n System.out.println();/n/n println('包总长:');/n println(String.valueOf(packetLength));/n System.out.println();/n/n println('标志位:');/n println(String.valueOf(identification));/n System.out.println();/n/n println('分片:');/n println(section);/n System.out.println();/n/n println('包属性:');/n println(property);/n System.out.println();/n/n println('分段偏移:');/n println(String.valueOf(fragmentOffset));/n System.out.println();/n/n println('TTL:');/n println(String.valueOf(ttl));/n System.out.println();/n/n println('协议号:');/n println(protocolCode + '(' + protocol + ')');/n System.out.println();/n/n println('头部校验和:');/n println(checkSum);/n System.out.println();/n/n println('原始地址:');/n println(sourceAddress.getHostAddress());/n System.out.println();/n/n println('目标地址:');/n println(targetAddress.getHostAddress());/n System.out.println();/n } catch (UnknownHostException e) {/n System.out.println('无效的IP地址');/n }/n }/n/n static void println(String msg) {/n System.out.printf('%'-15s', msg);/n }/n/n static byte[] getSubArray(byte[] array, int startIndex, int endIndex) {/n byte[] subArray = new byte[endIndex - startIndex];/n System.arraycopy(array, startIndex, subArray, 0, subArray.length);/n return subArray;/n }/n/n static byte[] hexStringToByteArray(String hexString) {/n int len = hexString.length();/n byte[] byteArray = new byte[len / 2];/n for (int i = 0; i < len; i += 2) {/n byteArray[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)/n + Character.digit(hexString.charAt(i + 1), 16));/n }/n return byteArray;/n }/n/n enum ProtocolType {/n ICMP(1),/n IGMP(2),/n TCP(6),/n UDP(17);/n/n private final int value;/n/n ProtocolType(int value) {/n this.value = value;/n }/n/n public int getValue() {/n return value;/n }/n }/

IP数据包头解析器 - Java代码实现

原文地址: https://www.cveoy.top/t/topic/fn6m 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录