`
aokunsang
  • 浏览: 814168 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IP地址与长整数之间的转换详解

    博客分类:
  • Java
 
阅读更多

今天终于搞懂了ip地址和整数之间的转换, 在这里和大家分享一下心得,唠叨一把。
事件起因:
   项目中用到通过ip地址获取城市名称,这样的原码网上一搜一大把,基本上都是lumaQQ的东西,在这里夸赞一番,确
实不错。它的原码里面用到了ip和整数之间的转换,长途跋涉进行了研究(只因大学计算机基础没有学好,哎... 重新研
究二进制,八进制,16进制),皇天不负有心人啊,终于搞定了。
事件过程:
   先得了解ip地址的“构造”是由32位二进制数组成的,然后再研究二进制的表示和Java的按位运算(在前面的博文中有
介绍),想了解ip和整数之间的转换,这个知识是必备的。
$1 :Ip转换为长整数的代码:

  public static long ipToLong(String ipString){
        long result = 0;
        java.util.StringTokenizer token = new java.util.StringTokenizer(ipString,".");
        result += Long.parseLong(token.nextToken())<<24;
        result += Long.parseLong(token.nextToken())<<16;
        result += Long.parseLong(token.nextToken())<<8;
        result += Long.parseLong(token.nextToken());
        return result;
    }

 

原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。

举例:一个ip地址为10.0.3.193
每段数字             相对应的二进制数
10                   00001010
0                    00000000
3                    00000011
193                  11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。


在上面的方法中,原理都是一样的。我用到了位移操作,因为它就是操作的二进制数,使用位移操作很方面、直观。
Long.parseLong(token.nextToken())<<24 就是把第一段数字表示的二进制数左移了24位,(记住:按位操作符都操作的整数的二进制数)

得到00001010 00000000 00000000 00000000;
依次类推:
Long.parseLong(token.nextToken())<<16,得到00000000 00000000 00000000 00000000;
Long.parseLong(token.nextToken())<<8,得到00000000 00000000 00000011 00000000;
Long.parseLong(token.nextToken()),最低位不用移动,得到00000000 00000000 00000000 11000001;
把这四个二进制数转换为整数后相加和00001010 00000000 00000011 11000001表示的二进制数是一样的(这个就不多说了,明白人一看就知道了)。
$2 :长整数转换为Ip的代码:

  public static String longToIp(long ipLong){
        StringBuilder sb = new StringBuilder();
        sb.append(ipLong>>>24);sb.append(".");
        sb.append(String.valueOf((ipLong&0x00FFFFFF)>>>16));sb.append(".");
        sb.append(String.valueOf((ipLong&0x0000FFFF)>>>8));sb.append(".");
        sb.append(String.valueOf(ipLong&0x000000FF));
        return sb.toString();
    }

 
原理:很简单的,就是$1的“反编码”(就这样先叫着),先把这个长整数转换成一个32位的二进制数。从左到右,每8位
进行一下分割,就得到4段8位的二进制数,把这些二进制数转换成整数然后加上"."就是这个ip地址了。

举例:167773121
二进制表示形式为:00001010 00000000 00000011 11000001
分割成四段:00001010,00001010,00000011,11000001,分别转换为整数后加上“.”就得到了10.0.3.193。
每段怎么计算为整数的呢,比如00001010,一个整数是32位的整数,所以前面全部补0(也就是说把该段的8位看成是低位数字,高位全部补0,得到一个32位的二进制数,即为一个整数的二进制数表示形式),由此可以得到
00000000 00000000 00000000 00001010,就是传说中的10,其他三个数字也就相继可以得到了。

上面的longToIp方法使用也是与$1中位移操作正好相反。
先得到第一段(它是二进制数的左边)的整数,那个长整型的二进制数字无符号左移24位(正好是前面都补0),得到一个二
进制数即为最高位的数字。即可以用位移实现ipLong>>>24(>>>操作的是ipLong的二进制数);
想得到第二段,就要把ipLong表示的二进制数进行无符号左移16位,但是它的左边不一定为0(还有第一段数字的二进制数
呢),所以在移位之前先把前面的的8位置为0,就可以用ipLong&0x00FFFFFF表示。
0x00FFFFFF是什么呢?为什么要&0x00FFFFFF呢?

0x00FFFFFF是一个16进制数,它的二进制表示形式为00000000 11111111 11111111 11111111,结合前篇博文【传说中的Java基础东西(按位操作运算)】的&用法,你就很清楚为啥要&0x00FFFFFF了,它可以使前8为置为0,后16位是1或者0还是不变的。
然后就可以肆无忌惮的把ipLong表示的二进制数进行无符号的左移16位。
ipLong&0x00FFFFFF 可以得到00000000 00000000 00000011 11000001,然后让它>>>16位,
得到00000000 00000000 00000000 00000000,即为第二段的数字0、
依次类推、
最后一段直接把前24位都置为0,然后计算出来的整数即为最后一段的值了。

OK,写了那么多,其实就是一个简单的把ip转换为整数,中间主要是操作了二进制数,想想也很简单,为啥以前咱就不会
呢。想了一下,原来还是自己的计算机基础的二进制没有学好,后悔啊,又浪费我的生命去重新学习....

分享到:
评论
2 楼 fireinjava 2016-06-26  
longToip直接用ipToLong反过来就好了
public static String longToIp(long ipLong) {
StringBuffer ip = new StringBuffer();
String binaryString = Long.toBinaryString(ipLong);
binaryString = StringUtils.leftPad(binaryString, 32, "0");
for (int i = 1; i <= 4; i++) {
String substring = binaryString.substring((i - 1) * 8, i *;
ip.append(Integer.valueOf(substring, 2)).append(i < 4 ? "." : "");
}
return ip.toString();
}
1 楼 lenomon 2012-03-11  
博主讲的比较复杂,这篇讲的比较简洁IP地址与整数之间的转换

相关推荐

    子网掩码的计算与划分详解

    例如,要计算 IP 地址 192.9.200.13 的网络号和主机号,需要将子网掩码 255.255.255.0 转换为二进制,然后与 IP 地址进行 AND 运算,得到网络号 192.9.200.0。然后,将子网掩码的二进制值取反后,与 IP 地址进行 AND...

    远程开机关机-从零教起.docx

    - 首先,将用户输入的点式IP地址转换为无符号长整数。 - 使用`SendARP`函数发送ARP请求,并接收目标计算机的MAC地址。 - 将收到的MAC地址转换为字符串格式,方便展示。 - 为了获取整个网络中的MAC地址,可以循环...

    专转本计算机基础辅导填空练习题.doc

    29. Internet中使用“DNS”来进行主机名字与IP地址之间的自动转换,这里的DNS指 **域名系统**。 30. IP地址分为A、B、C、D、E五类,如果网上某台主机的IP地址为93.129.10.10,该IP地址属于 **B** 类地址。 31. IP...

    大学计算机考试试题.pdf

    8. 域名解析:域名和IP地址之间的转换工作称为DNS(域名系统)解析。 9. PPT文本插入:在PowerPoint中,除了占位符外,可以通过插入文本框来添加文字。 10. 计算机发展与电子原件:电子计算机主要以电子原件类型...

    Host-byte-order-to-network-.rar_byte order_doc

    例如,`htons()`、`htonl()`、`ntohs()` 和 `ntohl()` 分别用于将短整型(short)、无符号短整型(unsigned short)、长整型(long)和无符号长整型(unsigned long)从主机字节顺序转换为网络字节顺序,以及反向...

    2016年计算机二级JAVA考试题及答案.pdf

    15. 域名和IP地址的关系:主机名和IP地址对应,但访问主机不一定非要用主机名,可以直接使用IP地址。 16. Java的并发管理机制:Java提供了多线程机制来管理并发任务。 17. 描述错误的Java特性:Java自动管理内存,...

    2014年同等学力计算机综合真题(无答案解析).docx

    - **IP地址和子网掩码**:IP地址的子网划分,计算子网地址和网络前缀位数。 - **数据链路层**:数据链路层的功能,如流量控制、透明传输和差错检测。 - **BGP协议**:边界网关协议的特性,如路径选择、路由信息...

    江苏计算机二级

    11. IP地址:IP地址由三部分构成,从左到右依次是网络号、主机号和类型号。 12. ADSL技术:ADSL上下行速率不同,下载通常远高于上传;可以电话数据同时使用;有效传输距离可达几公里;使用ADSL上网通常需要以太网...

    2021-2022计算机二级等级考试试题及答案No.18008.docx

    6. IP地址长度:Internet中的IP地址由32位二进制数组成,分为四段,每段8位。 7. 字节组成:计算机中,一个字节由8位二进制位组成。 8. 面向对象继承:继承是面向对象编程的一个特性,允许子类继承父类的属性和...

    《大学计算机应用基础》题库定义.pdf

    2. 域名服务器(DNS)的作用:DNS服务器存放的是Internet主机的域名与IP地址对照表,用于将域名解析成对应的IP地址,方便网络通信。 3. 办公自动化(OA):OA属于信息处理类的计算机应用,用于提高办公效率,处理...

    计算机考试A卷.pdf

    1. DNS(Domain Name System):DNS 是一种域名解析系统,它将人类易读的域名转换成计算机可识别的IP地址,解决IP地址难以记忆的问题。在题目中,DNS被提及用于解决IP数字地址的问题。 2. 域名代码:域名的后缀通常...

    2017年专升本计算机模拟试题及复习资料.doc

    30. **网卡功能**:网卡的主要功能不包括翻译物理地址(MAC地址)和逻辑地址(IP地址)。 双选题部分涉及到的内容较多,包括应用软件、内存与ROM、PowerPoint视图、磁盘格式化、文件复制操作、指令系统、Excel公式...

    2014年同等学力计算机综合真题(无答案解析).doc

    - **IP地址与子网掩码**:根据IP地址和子网掩码,可以计算子网地址。子网掩码255.255.224.0表示网络前缀有22位(255的二进制表示是11111111,224的二进制表示是11100000)。 - **TCP连接端点**:TCP的连接端点是...

    计算机一级B考试模拟试题1一5及答案解析.pdf

    12. 域名服务器DNS中存放Internet主机域名与IP地址的对照表。 13. 计算机的系统总线包含数据总线、控制总线和地址总线。 14. 办公室自动化(OA)属于信息处理的计算机应用。 15. 计算机病毒具有自我复制能力,能...

    Django框架序列化与反序列化操作详解

    9. `IPAddressField`: 处理IP地址。 10. `IntegerField`: 整数字段,可设置最大值和最小值。 11. `FloatField`: 浮点数字段,同样有最大值和最小值限制。 12. `DecimalField`: 用于精确的十进制数值,指定最大位数和...

    一级计算机基础及MS+Office模拟492.pdf

    - 域名不是IP地址,但可以通过DNS解析得到IP地址;域名不仅限于服务器使用;不是完全由用户自定义,需要遵循层次结构和注册规则。 14. 高级语言与低级语言的特性: - 高级语言编写的程序有很好的可移植性;机器...

    阿里巴巴2014年笔试题.pdf

    3. IP地址与子网划分:IP地址192.168.5.0/24,采用定长子网划分,子网掩码为255.255.255.248,说明每个子网有6个可用地址(因为255.255.255.248相当于/29掩码,除去网络地址和广播地址,剩下的主机地址为6个)。...

    《计算机网络》作业.pdf

    19. 当数据报在网络中传输时,IP地址会转换成MAC地址,以便进行物理网络的寻址。 20. 局域网协议通常将OSI的数据链路层分为MAC子层(Media Access Control)和LLC(Logical Link Control)子层。 21. 计算机通信网...

    2021-2022计算机二级等级考试试题及答案No.16194.docx

    在Java中,`InetAddress`类用于表示互联网协议(IP)地址,`getHostAddress()`方法用于获取该对象所代表的IP地址字符串。 2. 算法的空间复杂度是指算法执行过程中所需要的存储空间。它描述了算法在运行时内存的使用...

    计算机等级考试选择题(全含答案).pdf

    16. IP地址结构:A类地址的主机地址长度是24位二进制数。 17. 计算机病毒影响:特洛伊木马病毒可能导致数据篡改、密码窃取,但未联网时静态信息通常不受影响。 18. 数据库设计:采用单一表SC表示,数据冗余小,...

Global site tag (gtag.js) - Google Analytics