3

在下面的示例代码中,有人可以更详细地解释下面的行实际上在做什么,就像您向初学者解释它一样。

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);
}

}

4

1 回答 1

2
  • 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->按位 ORingresult ,与本例中的加法相同,因为在上一步之后,我们在 的末尾有 8 个零。

编辑(感谢@jtahlborn)->当字节转换为int时,需要使用0xFF进行按位与运算以避免符号扩展。

例子

192.200.3.0是有问题的 IP 地址。最终值为This是通过以下方式生成的

192*(2^24) + 200*(2^16) + 3*(2^8) + 0*(2^0)
3221225472 + 13107200 + 768 = 3234333440

现在您的代码执行相同的操作,但在二进制中使用按位移位 192 是11000000. 首先,它被添加到 result = 0; 结果是现在11000000。然后将其左移 8 位(有效地将其乘以 2^8)结果是11000000 00000000

现在,将二进制值 20011001000相加,生成结果11000000 11001000 继续这个过程,直到得到以下 32 位数字, 11000000 11001000 00000011 00000000转换为相同的 3234333440

于 2012-07-18T20:13:51.763 回答