在下面的示例代码中,有人能像向刚开始的开发人员解释一样,更详细地解释下面几行的实际操作吗。
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);
}
}
-
byte[] octets = ip.getAddress();
->将整个IP地址存储为字节数组 -
for (byte octet : octets) {}
->将字节数组拆分为八位字节,并对其进行迭代 -
result <<= 8 (shorthand for result = result<<8)
->左移8位将二进制结果移位8位,并添加8个尾随零。(将结果值乘以2^8) -
result |= octet & 0xff; (same as result|=octet which is shorthand for result = result | or octect
->位"或"运算,与本例中的加法相同,因为在上一步之后,我们在result
的末尾有8个零。
EDIT(感谢@jtalborn)->当字节转换为整数时,使用0xFF的逐位安定对于避免符号扩展是必要的
示例
192.200.3.0
是所讨论的IP地址。最终值为这是以以下方式生成的
192*(2^24) + 200*(2^16) + 3*(2^8) + 0*(2^0)
3221225472 + 13107200 + 768 = 3234333440
现在您的代码也执行相同的操作,但使用逐位移位二进制中的192是CCD_ 7。首先,它被添加到结果=0;结果现在是CCD_ 8。然后左移8位(有效地乘以2^8)结果是11000000 00000000
现在,加上二进制值200,即11001000
,结果现在为11000000 11001000
这个过程一直进行,直到你得到下面的32位数字,11000000 11001000 00000011 00000000
,转换为相同的3234333440