前段时间看概要设计文档发现有这么一段话,为了实现高效率的地址查找以及比对,将ip地址转化为long型存入redis进行处理balabala,具体是什么记不大清了大致就是这个意思。
之前没想过这个问题,ip地址竟然还能这么搞,于是测试了一下确实可以,举个简单例子先,比如有个ip地址是169.254.85.85,对应的二进制是10101001.11111110.1010101.1010101,将小数点去掉后变为101010011111111010101011010101,可以看到除了最低的位置的整数位置没有发生变化,其他三个位置的整数分别相对原来的位置左移了8位,16位,24位,而在二进制中每左移一位,就相当于*2,也就是说对应的每段数字分别乘2的8次方,16次方以及24次方,总体来说思路就是去掉ip地址的小数点后重新计算,上面这个ip地址转化为long型整数是2852017493,当然如果你觉得这样计算比较麻烦也可以通过将每段数字转化为十六进制后拼接,之后在计算器中直接转化为十进制效果是一样的,对应的十六进制是A9FE5555
好了明白了转化过程写代码就很简单了,直接上ip地址转化为long型整数的代码见下图
代码很简单这里就不用解释了。既然都写到这里了,那么整数转化为ip地址也是可以的,这里先上代码见下图
这里写了注释了就简单解释一下,思路就是取得每一段的数字,右移一位相当于除以2,通过将long型整数转化为二进制后与指定数量的f进行与运算,之后通过右移去掉不符合条件的位置保留所需的位置,最后用一个StringBuffer类的对象去拼接后转化为String即可。
最后写一下主方法进行一下简单测试,见下
运行后控制台输出符合预期,表示成功