判断两个IP地址是否在同一个网段

1. 流程图

graph TB
A[开始] --> B(获取IP地址和子网掩码)
B --> C(将IP地址和子网掩码转换为二进制)
C --> D(比较两个二进制是否相同)
D --> E{在同一个网段吗?}
E --> F[是]
E --> G[否]

2. 代码实现

首先,我们需要将IP地址和子网掩码转换为二进制,然后比较两个二进制是否相同。接下来,我将逐个步骤告诉你需要做什么,以及需要使用的代码。

步骤 1: 获取IP地址和子网掩码

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Main {
    public static void main(String[] args) {
        try {
            // 获取IP地址
            InetAddress address = InetAddress.getLocalHost();
            String ip = address.getHostAddress();
            
            // 获取子网掩码
            InetAddress subnetMask = InetAddress.getByName("255.255.255.0");
            String mask = subnetMask.getHostAddress();
            
            System.out.println("IP地址: " + ip);
            System.out.println("子网掩码: " + mask);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

注释:这段代码使用InetAddress.getLocalHost()方法获取本机IP地址,InetAddress.getByName()方法获取指定子网掩码的IP地址。需要注意的是,如果你不知道子网掩码的值,可以使用默认值255.255.255.0

步骤 2: 将IP地址和子网掩码转换为二进制

public class Main {
    // 将IP地址转换为二进制
    public static String ipToBinary(String ip) {
        String[] octets = ip.split("\\.");
        StringBuilder binary = new StringBuilder();
        
        for (String octet : octets) {
            int value = Integer.parseInt(octet);
            String binaryOctet = Integer.toBinaryString(value);
            
            while (binaryOctet.length() < 8) {
                binaryOctet = "0" + binaryOctet;
            }
            
            binary.append(binaryOctet);
        }
        
        return binary.toString();
    }
    
    // 将子网掩码转换为二进制
    public static String maskToBinary(String mask) {
        String[] octets = mask.split("\\.");
        StringBuilder binary = new StringBuilder();
        
        for (String octet : octets) {
            int value = Integer.parseInt(octet);
            String binaryOctet = Integer.toBinaryString(value);
            
            while (binaryOctet.length() < 8) {
                binaryOctet = "0" + binaryOctet;
            }
            
            binary.append(binaryOctet);
        }
        
        return binary.toString();
    }
    
    public static void main(String[] args) {
        try {
            // 获取IP地址和子网掩码
            InetAddress address = InetAddress.getLocalHost();
            String ip = address.getHostAddress();
            InetAddress subnetMask = InetAddress.getByName("255.255.255.0");
            String mask = subnetMask.getHostAddress();
            
            // 将IP地址和子网掩码转换为二进制
            String ipBinary = ipToBinary(ip);
            String maskBinary = maskToBinary(mask);
            
            System.out.println("IP地址的二进制表示: " + ipBinary);
            System.out.println("子网掩码的二进制表示: " + maskBinary);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

注释:这段代码定义了两个方法ipToBinarymaskToBinary,用于将IP地址和子网掩码转换为二进制形式。首先,我们将IP地址和子网掩码按照.分割成四个部分,然后将每个部分转换为对应的二进制形式。最后,将这四个二进制部分拼接在一起,得到完整的二进制表示。

步骤 3: 比较两个二进制是否相同

public class Main {
    // 省略之前的代码
    
    // 比较两个二进制是否相同
    public static boolean isSameNetwork(String ipBinary1, String ipBinary2, String maskBinary) {
        for (int i = 0; i < 32; i++) {
            if (maskBinary.charAt(i) == '1' && ipBinary1.charAt(i) != ipBinary2.charAt