ip与16进制互转,ip16进制


piwik取ip:ip与16进制互转


装了一个piwik做站点分析,类似自建的站长统计。想提取访客ip做一些应用,发现不是直接存的ip。

1、存储

1.1 ip在数据库中以16进制存储

网络地址: 192.168.33.123
每一个值最大不会越过255,也就是十六进制的FF,两个Byte刚好表示的最大值是255,
这样子,就可以用一个32位的整形来保存这个地址
192 168 33 123
1100 0000 1010 1000 0010 0001 0111 1011
把这些二进制合在一起就是32位的数了
11000000101010000010000101111011
十进制为
3232244091

1.2 php

piwik是php语言,php中有ip2long(),long2ip()2个函数实现ip与进制互转
存到数据库中就是16进制的短地址了。

2、mysql

mysql内建函数支持
SELECT inet_ntoa(3520061481); –> 209.207.224.41
SELECT INET_ATON(‘209.207.224.41’); –> 3520061481

SELECT inet_ntoa(conv(hex(location_ip), 16, 10)) as ip, idvisitor 
FROM piwik_log_visit;

3、oracle

piwik数据库用的mysql,我同步回本地的oracle,取ip实现如下:

select 
    idvisitor,trunc(ip/16777216)||'.'|| trunc( mod(ip, 16777216)/65536) ||'.'|| trunc(mod(ip,65536)/256)||'.'|| trunc(mod(ip,256)) as ip
from
    (select idvisitor,location_ip as ip from PIWIK_LOG_VISIT)

3、java

如果数据库中取出来没转换好,需在程序中实现,java代码如下

long2ip:

public class test {
    public static void main(String[] args) {
        long lon = 0x1b9f160f;
        String ip = "";
        int[] b = new int[4];
        b[0] = (int) ((lon >> 24) & 0xff);
        b[1] = (int) ((lon >> 16) & 0xff);
        b[2] = (int) ((lon >> 8) & 0xff);
        b[3] = (int) (lon & 0xff);

        ip = Integer.toString(b[0]) + "." + Integer.toString(b[1]) + "." + Integer.toString(b[2])+ "." + Integer.toString(b[3]);

        System.out.println(ip);
    }
}

相关内容

    暂无相关文章