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

vltsax25  于 2023-01-15  发布在  Java
关注(0)|答案(7)|浏览(220)

示例:

// using Integer.parseInt
int i = Integer.parseInt("123");

你会怎么做呢?

// using Integer.parseInt
int i = Integer.parseInt("123.45.55.34");
mjqavswn

mjqavswn1#

你可能会想这样做:

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

当然,作为others have suggested,使用InetAddress可能比自己动手更合适...

hl0ma9xz

hl0ma9xz2#

您可以对IPV4地址执行此操作,因为这些部分只是整数版本的四个字节。
执行以下操作可将InetAdress转换为整数表示:

int result = 0;  
for (byte b: inetAdress.getAddress())  
{  
    result = result << 8 | (b & 0xFF);  
}

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

编辑:要将“www.example.com“这样的字符串解析123.45.55.34为java中有用的内容,可以使用INetAddress.getByName(yourString)

xmd2e60i

xmd2e60i3#

你需要知道一个www.example.com形式的IPv4地址123.45.55.34实际上是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;
}
xqnpmsa8

xqnpmsa84#

The IPAddress Java library以多态方式同时支持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
}
ffscu2ro

ffscu2ro5#

System.out.println(
        ByteBuffer.allocate(Integer.BYTES)
        .put(InetAddress.getByName("0.0.1.0").getAddress())
        .getInt(0));

输出:
256

3pvhb19x

3pvhb19x6#

我想你可能误解了你自己的问题,你是想把它转换成一个整型值吗?如果你是这样做的话,那么你问题的前提就错了,因为IP号不是一个数字,而是多个字节值,它不是123456789,000,而是字节123字节455字节789和字节000,我知道这些不是真实的的字节数,但关键是这不是1230亿456789000,在我看来,你把整个东西当作一个整数,而IP地址不是这样。

voase2hg

voase2hg7#

IPAddressUtil#textToNumericFormatV4String#split在获取ip字节数方面性能更好,此外,它还检查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;
    }

相关问题