从127.0.0.1到2130706433,然后再回来

时间:2010-02-10 23:50:23

标签: java ip-address

使用标准Java库,从IPV4地址("127.0.0.1")的虚线字符串表示到等效整数表示(2130706433)的最快捷方式是什么。

相应地,反转所述操作的最快方法是什么 - 从整数2130706433到字符串表示"127.0.0.1"

7 个答案:

答案 0 :(得分:30)

String to 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());

Int to 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()

答案 1 :(得分:28)

您还可以使用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));

答案 2 :(得分:10)

我修改了原来的答案。在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

答案 3 :(得分:3)

如果您需要学习长手数学,可以使用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

答案 4 :(得分:2)

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

e.g。

 byteBuffer.put(integer).array();

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

答案 5 :(得分:2)

使用the IPAddress Java library很简单,每个方向都有一行代码。 免责声明:我是该图书馆的项目经理。

    IPv4Address loopback = new IPAddressString("127.0.0.1").getAddress().toIPv4();
    System.out.println(loopback.intValue());
    IPv4Address backAgain = new IPv4Address(loopback.intValue());
    System.out.println(backAgain);

输出:

    2130706433
    127.0.0.1

答案 6 :(得分:0)

另一种方式:

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