繁体   English   中英

如何在 Java 中将字符串(IP 号码)转换为 Integer

[英]How to convert string (IP numbers) to Integer in Java

例子:

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

请注意,您现在不应该对 IP 地址使用 32 位整数,因为我们正在进入 IPV6 地址时代。

编辑:要将像“123.45.55.34”这样的字符串解析为在 java 中有用的东西,您可以使用INetAddress.getByName(yourString)

您需要意识到 123.45.55.34 形式的 IPv4 地址实际上是 4 个三位数字,代表地址的每个字节。 一次解析整个字符串是行不通的。

其他人提到使用InetAddress ,但如果你所拥有的只是IP的字符串表示,就我所知,你不能轻易实例化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;
    }

我想你可能误解了你自己的问题。 您是否要将其转换为单个 int 值? 如果你这样做那么你的问题的前提是错误的,因为 IP 数字不是一个数字而是多个字节值。 它不是 123,456,789,000,而是字节 123 字节 455 字节 789 和字节 000。我知道这些不是真正的字节数,但关键是这不是 1230 亿 4.56 亿 78.9 万。 在我看来,您将整个事物视为单个 integer 而 IP 地址并非如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM