在下面的示例代码中,是否有人可以更详细地解释下面几行代码的实际作用,就像您向初学者解释它一样。
for (byte octet : octets) {
result <<= 8;
result |= octet & 0xff;
}
public class Example {
public static long ipToLong(InetAddress ip) {
byte[] octets = ip.getAddress();
long result = 0;
for (byte octet : octets) {
result <<= 8;
result |= octet & 0xff;
}
return result;
}
public static void main(String[] args) throws UnknownHostException {
long ipLo = ipToLong(InetAddress.getByName("192.200.0.0"));
long ipHi = ipToLong(InetAddress.getByName("192.255.0.0"));
long ipToTest = ipToLong(InetAddress.getByName("192.200.3.0"));
System.out.println(ipToTest >= ipLo && ipToTest <= ipHi);
}}
发布于 2012-07-19 04:13:52
byte[] octets = ip.getAddress(); arrayfor (byte octet : octets) {}将整个IP地址存储为字节数组->将字节数组拆分为八位数组,并在themresult <<= 8 (shorthand for result = result<<8) -> 上迭代左移8位将结果以二进制形式移位8位,并添加8个尾随零。(将result的值乘以2^8)result |= octet & 0xff; (same as result|=octet which is shorthand for result = result | or octect -> 位数ORing,与本例中的加法相同,因为在上一步之后,result的末尾有8个零。编辑(感谢@jtahlborn) ->在字节转换为整数时,必须使用0xFF进行逐位与操作,以避免符号扩展。
示例
192.200.3.0是有问题的IP地址。最后一个值是,它是以以下方式生成的
192*(2^24) + 200*(2^16) + 3*(2^8) + 0*(2^0)
3221225472 + 13107200 + 768 = 3234333440现在你的代码做了同样的事情,但是在二进制中使用位移位192是11000000。首先,将其添加到result = 0;result现在是11000000。然后将其左移8位(有效地乘以2^8),结果为11000000 00000000
现在,将二进制值11001000相加,使得结果现在11000000 11001000这个过程继续进行,直到你有下面的32位数字,11000000 11001000 00000011 00000000,翻译成同样的3234333440
https://stackoverflow.com/questions/11549390
复制相似问题