在应用程序开发中,涉及到IP地址的存储,大部分开发人员都将其存为String(或文本类型)。能否将固定格式为m.n.x.y的IP地址转换成Long型的数字呢?答案是肯定的。在数据库层面,可以直接将结果设置成表的主键,避免IP地址的重复,因为是主键,也就是表的索引了,数据库查找时会更快。
对于格式为m.n.x.y的IP地址,转换成Long型数字的算法如下:
- Long ipLong = 256 * 256 * 256 * m +
- 256 * 256 * n +
- 256 * x +
- y
使用Java语言,则这样实现:
- private static Long setIP(String ipaddr) {
- String ip[] = ipaddr.split("\\.");
- Long ipLong = 256 * 256 * 256 * Long.parseLong(ip[0]) +
- 256 * 256 * Long.parseLong(ip[1]) +
- 256 * Long.parseLong(ip[2]) +
- Long.parseLong(ip[3]);
- return ipLong;
- }
那么,对于已知的一个表示IP地址的Long型数字,又该如何将其还原成String(字符型)的IP地址呢?算法也很简单,整除和取余。使用Java语言,则这样实现:
- private static String getIP(Long ipaddr) {
- long y = ipaddr % 256;
- long m = (ipaddr - y) / (256 * 256 * 256);
- long n = (ipaddr - 256 * 256 *256 * m - y) / (256 * 256);
- long x = (ipaddr - 256 * 256 *256 * m - 256 * 256 *n - y) / 256;
- return m + "." + n + "." + x + "." + y;
- }
算法测试:
- public static void main(String[] args) {
- Long ipLong = setIP("183.62.169.146");
- System.out.println(ipLong);
- System.out.println(getIP(ipLong));
- }
结果:
3074337170
183.62.169.146