首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这段Java代码如何转换ip地址?

这段Java代码如何转换ip地址?
EN

Stack Overflow用户
提问于 2012-07-19 04:06:01
回答 1查看 1.1K关注 0票数 3

在下面的示例代码中,是否有人可以更详细地解释下面几行代码的实际作用,就像您向初学者解释它一样。

代码语言:javascript
复制
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);
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-19 04:13:52

  • byte[] octets = ip.getAddress(); array
  • for (byte octet : octets) {}将整个IP地址存储为字节数组->将字节数组拆分为八位数组,并在them
  • result <<= 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地址。最后一个值是,它是以以下方式生成的

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11549390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档