从127.0.0.1到2130706433,再回来

使用标准的Java库,从IPV4地址( "127.0.0.1" )的虚线string表示到等效整数表示( 2130706433 )的最快方法是什么?

相应地,反转所述操作的最快方法是 – 从整数2130706433到string表示"127.0.0.1"

string到int:

 int pack(byte[] bytes) { int val = 0; for (int i = 0; i < bytes.length; i++) { val <<= 8; val |= bytes[i] & 0xff; } return val; } pack(InetAddress.getByName(dottedString).getAddress()); 

诠释为string:

 byte[] unpack(int bytes) { return new byte[] { (byte)((bytes >>> 24) & 0xff), (byte)((bytes >>> 16) & 0xff), (byte)((bytes >>> 8) & 0xff), (byte)((bytes ) & 0xff) }; } InetAddress.getByAddress(unpack(packedBytes)).getHostAddress() 

您也可以使用Google Guava InetAddress类 :

 String ip = "192.168.0.1"; InetAddress addr = InetAddresses.forString(ip); // Convert to int int address = InetAddresses.coerceToInteger(addr); // Back to str String addressStr = InetAddresses.fromInteger(address)); 

我修改了我原来的答案。 在Sun的InetAddress实现中, hashCode方法产生了IPv4地址的整数表示,但正如指出的那样,JavaDoc并不能保证这一点。 因此,我决定使用ByteBuffer类来计算IPv4地址的值。

 import java.net.InetAddress; import java.nio.ByteBuffer; // ... try { // Convert from integer to an IPv4 address InetAddress foo = InetAddress.getByName("2130706433"); String address = foo.getHostAddress(); System.out.println(address); // Convert from an IPv4 address to an integer InetAddress bar = InetAddress.getByName("127.0.0.1"); int value = ByteBuffer.wrap(bar.getAddress()).getInt(); System.out.println(value); } catch (Exception e) { e.printStackTrace(); } 

输出将是:

 127.0.0.1 2130706433 

如果你需要学习长手math,你可以使用Substr来翻译八位字节。 (256 * 256 * 256)或(2 ^ 24)秒乘以(256 * 256)(2 ^ 16)乘以(256)(2 ^ 8)乘以1得到的第一个八位位组(2 ^ 0)

127 *(2 ^ 24)+ 0 *(2 ^ 16)+ 0 *(2 ^ 8)+ 1 *(2 ^ 0)2130706432 + 0 + 0 + 1 = 2130706433

我还没有尝试过。 性能,但最简单的方法可能是使用NIO的ByteBuffer 。

例如

  byteBuffer.put(integer).array(); 

会返回一个表示整数的字节数组。 您可能需要修改字节顺序。

其他方式:

 public static 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; }