ip地址与java中的子网掩码匹配

时间:2016-01-29 12:56:20

标签: java ip-address

我有以下场景:假设我收到一个包含Ipv4地址的数据包。我需要根据此IP地址与某个子网掩码的匹配来执行某些方法。我想做一个基于IP和掩码的if指令。

示例:假设要传递的条件是数据包的目标IP地址必须为150.0.0.0/8。如果我收到一个IP地址为150.1.1.1的数据包,则会处理该数据包,而如果我收到一个IP为151.2.2.2的数据包,则该数据包将被忽略。

如何设置此规则? 谢谢!

2 个答案:

答案 0 :(得分:2)

  public long ipToLong(String ipAddress) {

    long result = 0;

    String[] ipAddressInArray = ipAddress.split("\\.");

    for (int i = 3; i >= 0; i--) {

        long ip = Long.parseLong(ipAddressInArray[3 - i]);

        //left shifting 24,16,8,0 and bitwise OR

        //1. 192 << 24
        //1. 168 << 16
        //1. 1   << 8
        //1. 2   << 0
        result |= ip << (i * 8);

    }

    return result;
  }
long gw = ipToLong("150.0.0.0") // i assume you converted the ip to a 32bit unsigned int
int netmaskBits = 8; // in your example you had: /8, so this is 8

// clear the right-most bits, leave only the leftmost 8 bits
long netmask = (gw>>(32-netmaskBits))<<(32-netmaskBits); 

long ip = ipToLong("150.1.1.1");
long maskedIp = (ip>>(32-netmaskBits))<<(32-netmaskBits); 
if (maskedIp == netmask) {System.out.println("allowed")}

答案 1 :(得分:0)

您可以这样计算:

151.1.1.1 &
255.0.0.0

这将为您提供网络地址。如果地址与150.0.0.0匹配,则接受该包。这是一个简单的逻辑and