我有以下场景:假设我收到一个包含Ipv4地址的数据包。我需要根据此IP地址与某个子网掩码的匹配来执行某些方法。我想做一个基于IP和掩码的if指令。
示例:假设要传递的条件是数据包的目标IP地址必须为150.0.0.0/8
。如果我收到一个IP地址为150.1.1.1
的数据包,则会处理该数据包,而如果我收到一个IP为151.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
。