例子:
// using Integer.parseInt
int i = Integer.parseInt("123");
你会如何做同样的事情?
// using Integer.parseInt
int i = Integer.parseInt("123.45.55.34");
您可能想要这样做:
// Parse IP parts into an int array
int[] ip = new int[4];
String[] parts = "123.45.55.34".split("\\.");
for (int i = 0; i < 4; i++) {
ip[i] = Integer.parseInt(parts[i]);
}
或这个:
// Add the above IP parts into an int number representing your IP
// in a 32-bit binary form
long ipNumbers = 0;
for (int i = 0; i < 4; i++) {
ipNumbers += ip[i] << (24 - (8 * i));
}
当然,正如其他人所建议的那样,使用InetAddress
可能比自己做事情更合适......
您可以为 IP V4 地址执行此操作,因为这些部分只是整数版本的四个字节。
这样做可以将InetAdress转换为其整数表示:
int result = 0;
for (byte b: inetAdress.getAddress())
{
result = result << 8 | (b & 0xFF);
}
请注意,现在不应将 32 位整数用于 IP 地址,因为我们正在进入 IPV6 地址时代。
编辑:要将像“123.45.55.34”这样的字符串解析为java中有用的东西,你可以使用INetAddress.getByName(yourString)
您需要意识到 123.45.55.34 形式的 IPv4 地址实际上是 4 个三位数字,代表地址的每个字节。一次解析整个字符串是行不通的。
其他人已经提到过使用,但如果你所拥有的只是 IP 的字符串表示,那么据我所知,InetAddress
你不能轻易地实例化 an 。InetAddress
您可以执行以下操作:
public static int parseIp(String address) {
int result = 0;
// iterate over each octet
for(String part : address.split(Pattern.quote("."))) {
// shift the previously parsed bits over by 1 byte
result = result << 8;
// set the low order bits to the current octet
result |= Integer.parseInt(part);
}
return result;
}
IPAddress Java 库以多态方式支持 IPv4 和 IPv6。免责声明:我是那个图书馆的项目经理。
以下代码适用于 IPv4 和 IPv6 地址。使用您的示例 IPv4 地址:
IPAddress addr = new IPAddressString("123.45.55.34").getAddress();
BigInteger value = addr.getValue(); // 2066560802
如果是 IPv4,您可以直接使用 int 值:
if(addr.isIPv4()) {
int val = addr.toIPv4().intValue(); // 2066560802
}
System.out.println(
ByteBuffer.allocate(Integer.BYTES)
.put(InetAddress.getByName("0.0.1.0").getAddress())
.getInt(0));
输出:
256
IPAddressUtil#textToNumericFormatV4
比获取 ip 字节执行得更好String#split
,此外,它检查 ip 是否有效
public int intOfIpV4(String ip) {
int result = 0;
byte[] bytes = IPAddressUtil.textToNumericFormatV4(ip);
if (bytes == null) {
return result;
}
for (byte b : bytes) {
result = result << 8 | (b & 0xFF);
}
return result;
}