In this tutorial, we show you how to convert an IP address to its decimal equivalent in Java, and vice versa. For examples :

Bash
255.255.255.255  <->  4294967295
192.168.1.2 <-> 3232235778

1. IP Address to Decimal

We show you two ways to convert an IP address to a decimal number

  1. Normal power of 256
  2. Bit shifting

1.1 First Example – Power of 256
The IP address is “base 256”, to convert 192.168.1.2 to decimal (base 10) the formula is:

Bash
192 x (256)^3 + 168 x (256)^2 + 1 x (256)^1 + 2 (256)^0 = ?
3221225472 + 11010048 + 256 + 2 = 3232235778
Java
  public long ipToLong(String ipAddress) {

	String[] ipAddressInArray = ipAddress.split("\\.");

	long result = 0;
for (int i = 0; i < ipAddressInArray.length; i++) { int power = 3 - i;
int ip = Integer.parseInt(ipAddressInArray[i]);
result += ip * Math.pow(256, power); } return result;
}

Some developers prefer to use modular like this

Java
result += (Integer.parseInt(ipAddressInArray[i]) % 256 * Math.pow(256, power));

1.2 Second Example - Bit shifting
Review the binary bit shifting graph below :

Java
  public long ipToLong(String ipAddress) {

	long result = 0;

	String[] ipAddressInArray = ipAddress.split("\\.");

	for (int i = 3; i >= 0; i--) {

		long ip = Long.parseLong(ipAddressInArray[3 - i]);

		//left shifting 24,16,8,0 and bitwise OR

		//1. 192 << 24
//1. 168 << 16
//1. 1 << 8
//1. 2 << 0
result |= ip << (i * 8); } return result;
}
Bash
192         00000000 00000000 00000000 11000000
-----------------------------------------------
192 << 24 11000000 00000000 00000000 00000000
Result 00000000 00000000 00000000 00000000
Result |= 11000000 00000000 00000000 00000000 168 00000000 00000000 00000000 10101000
-----------------------------------------------
168 << 16 00000000 10101000 00000000 00000000
Result 11000000 00000000 00000000 00000000
Result |= 11000000 10101000 00000000 00000000 1 00000000 00000000 00000000 00000001
-----------------------------------------------
1 << 8 00000000 00000000 00000001 00000000
Result 11000000 10101000 00000000 00000000
Result |= 11000000 10101000 00000001 00000000 2 00000000 00000000 00000000 00000010
-----------------------------------------------
2 << 0 00000000 00000000 00000000 00000010
Result 11000000 10101000 00000001 00000000
Result |= 11000000 10101000 00000001 00000010

Convert the final binary code to decimal, by hand calculation :) ~

Bash
Result      11000000 10101000 00000001 00000010
index 0 - 31, start from right.
31(1),30(1),29,28,27,26,25,24,23(1),22,21(1),20,19(1),18,17,16,15,14,13,12,11,10,9,8(1),7,6,5,4,3,2,1(1),0
Decimal 1x2^31 + 1x2^30 + 1x2^23 + 1x2^21 + 1x2^19 + 1x2^8 + 1x2^1
2147483648 + 1073741824 + 8388608 + 2097152 + 524288 + 256 + 2
3232235778

2. Decimal to IP Address

We show you two bit shifting and "0xff" masking examples to convert a decimal number back to IP address. The bit shifting is very hard to explain in words, it's better review the binary flows below :

2.1 First Example.

Java
  //ip = 3232235778
public String longToIp(long ip) {
StringBuilder result = new StringBuilder(15); for (int i = 0; i < 4; i++) { result.insert(0,Long.toString(ip & 0xff)); if (i < 3) {
sb.insert(0,'.');
} ip = ip >> 8;
}
return result.toString();
}

Review the bit shifting flows :

Bash
3232235778		11000000 10101000 00000001 00000010

<<Loop 1>>
-----------------------------------------------------------
ip 11000000 10101000 00000001 00000010
& 0xff 00000000 00000000 00000000 11111111
Result 00000000 00000000 00000000 00000010 = 2
Result Append .2
-------------------------> 8
ip >> 8 00000000 11000000 10101000 00000001 {off 00000010} <<Loop 2>>
-----------------------------------------------------------
ip 00000000 11000000 10101000 00000001
& 0xff 00000000 00000000 00000000 11111111
Result 00000000 00000000 00000000 00000001 = 1
Result Append 1.2
----------------> 8
ip >> 8 00000000 00000000 11000000 10101000 {off 00000001} <<Loop 3>>
-----------------------------------------------------------
ip 00000000 00000000 11000000 10101000
& 0xff 00000000 00000000 00000000 11111111
Result 00000000 00000000 00000000 10101000 = 168
Result Append 168.1.2
-------> 8
ip >> 8 00000000 00000000 00000000 11000000 {off 10101000} <<Loop 4>>
-----------------------------------------------------------
ip 00000000 00000000 00000000 11000000
& 0xff 00000000 00000000 00000000 11111111
Result 00000000 00000000 00000000 11000000 = 192
Result Append 192.168.1.2
-----------> 8
ip >> 8 00000000 00000000 00000000 00000000 {off 11000000}

2.2 Second Example.

Java
  //ip = 3232235778
public String longToIp(long ip) { return ((ip >> 24) & 0xFF) + "."
+ ((ip >> 16) & 0xFF) + "."
+ ((ip >> 8) & 0xFF) + "."
+ (ip & 0xFF); }
Bash
3232235778		11000000 10101000 00000001 00000010

1. (ip >> 24) & 0xFF
-----------------------------------------------------------
ip 11000000 10101000 00000001 00000010
-------------------------------------> 24
ip >> 24 00000000 00000000 00000000 11000000 {off 10101000 00000001 00000010}
& 0xff 00000000 00000000 00000000 11111111
Result 00000000 00000000 00000000 11000000 = 192 2. (ip >> 16) & 0xFF
-----------------------------------------------------------
ip 11000000 10101000 00000001 00000010
-------------------------------------> 16
ip >> 16 00000000 00000000 11000000 10101000 {off 00000001 00000010}
& 0xff 00000000 00000000 00000000 11111111
Result 00000000 00000000 00000000 10101000 = 168 3. (ip >> 8) & 0xFF
-----------------------------------------------------------
ip 11000000 10101000 00000001 00000010
--------------------------------------> 8
ip >> 24 00000000 11000000 10101000 00000001 {off 00000010}
& 0xff 00000000 00000000 00000000 11111111
Result 00000000 00000000 00000000 00000001 = 1 4. ip & 0xFF
-----------------------------------------------------------
ip 11000000 10101000 00000001 00000010
& 0xff 00000000 00000000 00000000 11111111
Result 00000000 00000000 00000000 00000010 = 2

3. Java Source Code

Full Java example to demonstrate above scenario :

Java
package com.mkyong.core;

public class JavaBitwiseExample {

	public static void main(String[] args) {

		JavaBitwiseExample obj = new JavaBitwiseExample();

		System.out.println("iptoLong  : " + obj.ipToLong("192.168.1.2"));
System.out.println("iptoLong2 : " + obj.ipToLong2("192.168.1.2")); System.out.println("longToIp : " + obj.longToIp(3232235778L));
System.out.println("longToIp2 : " + obj.longToIp2(3232235778L)); } // example : 192.168.1.2
public long ipToLong(String ipAddress) { // ipAddressInArray[0] = 192
String[] ipAddressInArray = ipAddress.split("\\."); long result = 0;
for (int i = 0; i < ipAddressInArray.length; i++) { int power = 3 - i;
int ip = Integer.parseInt(ipAddressInArray[i]); // 1. 192 * 256^3
// 2. 168 * 256^2
// 3. 1 * 256^1
// 4. 2 * 256^0
result += ip * Math.pow(256, power); } return result; } public long ipToLong2(String ipAddress) { long result = 0; String[] ipAddressInArray = ipAddress.split("\\."); for (int i = 3; i >= 0; i--) { long ip = Long.parseLong(ipAddressInArray[3 - i]); // left shifting 24,16,8,0 and bitwise OR // 1. 192 << 24
// 1. 168 << 16
// 1. 1 << 8
// 1. 2 << 0
result |= ip << (i * 8); } return result;
} public String longToIp(long i) { return ((i >> 24) & 0xFF) +
"." + ((i >> 16) & 0xFF) +
"." + ((i >> 8) & 0xFF) +
"." + (i & 0xFF); } public String longToIp2(long ip) {
StringBuilder sb = new StringBuilder(15); for (int i = 0; i < 4; i++) { // 1. 2
// 2. 1
// 3. 168
// 4. 192
sb.insert(0, Long.toString(ip & 0xff)); if (i < 3) {
sb.insert(0, '.');
} // 1. 192.168.1.2
// 2. 192.168.1
// 3. 192.168
// 4. 192
ip = ip >> 8; } return sb.toString();
} /*
private static void printPrettyBinary(String binary) { String s1 = String.format("%32s", binary).replace(' ', '0'); System.out.format("%8s %8s %8s %8s %n",
s1.substring(0, 8),
s1.substring(8, 16),
s1.substring(16, 24),
s1.substring(24, 32));
}
*/
}

Output

Bash
iptoLong  : 3232235778
iptoLong2 : 3232235778
longToIp : 192.168.1.2
longToIp2 : 192.168.1.2

地址:http://www.mkyong.com/java/java-convert-ip-address-to-decimal-number/

Java – Convert IP address to Decimal Number的更多相关文章

  1. [转]How to convert IP address to country name

    本文转自:http://www.codeproject.com/Articles/28363/How-to-convert-IP-address-to-country-name   Download ...

  2. lwip IP address handling 关于 IP 地址的 操作 API接口

    lwip 2.0.3  IP address handling /** * @file * IP address API (common IPv4 and IPv6) */ 1.u32_t ipadd ...

  3. Convert IPv6 Address to IP numbers (C#)

    URL: http://lite.ip2location.com/ Use the code below to convert the IP address of your web visitors ...

  4. Java Regex match IP address

    Reference: [1] https://www.mkyong.com/regular-expressions/how-to-validate-ip-address-with-regular-ex ...

  5. poj 2105 IP Address(水题)

    一.Description Suppose you are reading byte streams from any device, representing IP addresses. Your ...

  6. IP Address 分类: POJ 2015-06-12 19:34 12人阅读 评论(0) 收藏

    IP Address Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 19125   Accepted: 11053 Desc ...

  7. 华东师大OJ:IP Address【IP地址转换】

    /*===================================== IP Address Time Limit:1000MS Memory Limit:30000KB Total Subm ...

  8. poj2105 IP Address(简单题)

    题目链接:id=2105">http://poj.org/problem?id=2105 ----------------------------------------------- ...

  9. IP address/地址 检查

    1.Determine if a string is a valid IP address in C Beej's Guide to Network Programming 2.9.14. inet_ ...

随机推荐

  1. js 数组循环删除元素或对象

    1.根据不同条件,删除数组中的元素或对象 for(var i=0,flag=true,len=attrList.length;i<len;flag ? i++ : i){ if(attrList ...

  2. oracle 建表时显示ORA-00904无效的标识符

      oracle 建表时显示ORA-00904无效的标识符 CreationTime--2018年7月19日16点03分 Author:Marydon 1.情景展示 使用plsql建表时,报错 字段展 ...

  3. 获取List对象的泛型类(原创)

    群里一个伙计的需求,最后我提出了这种解决方案,不过他觉得多写俩括号增加了调用方的难度.还是先记下来吧,有时间看看还能不能再改造.   1.直接获取时获取不到的,类型被虚拟机擦除了2.利用子类实现父类的 ...

  4. JDBC实战案例--利用jdbc实现的宠物信息管理系统

    一.需求: 利用jdbc实现对宠物的信息进行管理的一套系统 宠物信息:宠物ID,宠物类别,宠物名字,宠物性别,宠物年龄,宠物入库日期 系统完成功能:实现对宠物信息的录入,修改,删除,查询. 二.解决方 ...

  5. permission denied make_sock could not bind to address 81问题解决

    在apache中绑定非http标准端口时,一直出现如下的错误提示: [root@localhost ~]# /etc/init.d/httpd start Starting httpd: (13)Pe ...

  6. Java API 各个包的内容解释

    java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类. java.awt 包含用于创建用户界面和绘制图形图像的所有类. java.awt. ...

  7. HDUOJ----Safecracker(1015)

    Safecracker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  8. eclipse容易卡死或者较慢的解决方案

    http://blog.sina.com.cn/s/blog_5c6c4dc90100lg8n.html 问题: Eclipse经常卡住或Building workspace等待,感觉很不爽,很多朋友 ...

  9. 谈谈easyui datagrid 的数据加载(转)

    这篇文章只谈jQuery easyui datagrid 的数据加载,因为这也是大家谈论最多的内容.其实easyui datagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数 ...

  10. CURL实现HTTP的GET POST方法

    Curl是Linux下一个非常强大的http命令行工具,其功能十分强大. 一.CURL对HTTP的常规訪问 1. 訪问站点 $ curl http://www.linuxidc.com 回车之后.ww ...