这个Java代码是如何转换ip地址的



在下面的示例代码中,有人能像向刚开始的开发人员解释一样,更详细地解释下面几行的实际操作吗。

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

最新更新