`
aokunsang
  • 浏览: 812576 次
  • 性别: 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地址转换成整数,整数转换成IP地址

    IP地址转换成整数,整数转换成IP地址,16进制转换成IP地址,IP地址转换成16进制

    易语言转换IP到长整数

    易语言转换IP到长整数源码,转换IP到长整数,IP到长整数

    IP地址与整数互相转换类

    IP地址与整数互相转换类,支持互互转。 当然,必然提供正确的Ip地址及整数信息。 整数建议字段选用bigint

    python将ip地址转换成整数的方法

    有时候我们用数据库存储ip地址时可以将ip地址转换成整数存储,整数占用空间小,索引也会比较方便,下面的python代码自定义了一个ip转换成整数的函数,非常简单,代码同时还提供了整数转换成ip地址的方法。...

    易语言源码易语言转换IP到长整数源码.rar

    易语言源码易语言转换IP到长整数源码.rar 易语言源码易语言转换IP到长整数源码.rar 易语言源码易语言转换IP到长整数源码.rar 易语言源码易语言转换IP到长整数源码.rar 易语言源码易语言转换IP到长整数源码.rar ...

    易语言IP地址转换

    易语言IP地址转换源码,IP地址转换,查询IP到地址,二分法确定位置,取地区文本,IP文本转整数值,十六进制到十进制,倒转十六进制文本,IP文本补位,十六进制文本到IP地址,十六进制单项补位,获得数据库数据数量,获得数据库...

    C# IP地址与整数之间转换的具体方法

    IP地址与整数之间的转换 1、IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个无符号的32位整数。 举例:一个ip地址为10.0.3....

    PTAIP地址转换(C语言版)

    7-2 IP地址转换 (20分) 一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。 输入格式: 输入在一行中给出32位二进制字符串。 输出格式: ...

    IP地址与十进制互相转换js函数

    IP地址与十进制,互相转换js函数,直接可以使用

    CString与DWORD的相互转换(IP地址的转换)

    CString与DWORD的相互转换(IP地址的转换),常用字符转换,ip地址控件与编辑框控件类型转换

    易语言转换IP到长整数源码

    易语言转换IP到长整数源码。@资源源码站。

    1-7 网络IP地址转换

    1-7 网络IP地址转换

    IP地址转换 v1.0

    “IP地址库国家省市转换格式化工具”能对纯真IP地址库进行二次转换,格式为国家、省、市的数据。 优点 1、通过程序自动转换。2、能自定义非规范数据。纯真IP地址库有不少不规范的数据,如:只显示某某大学而没具体...

    IP地址转换软件

    可以转换IP地址,让互联网和局域网之间互相转换

    组播IP地址与组播MAC地址之间的换算方法与例子.pdf

    组播IP地址与组播MAC地址之间的换算方法与例子.pdf

    IP地址与整数之间的转换实现代码(asp.net)

    把这个整数转换成一个32位二进制数。从左到右,每8位进行一下分割,得到4段8位的二进制数,把这些二进制数转换成整数然后加上”。”就是这个ip地址了

Global site tag (gtag.js) - Google Analytics