Java中的INET_NTOA和INET_ATON

inkz8wg9  于 2023-05-21  发布在  Java
关注(0)|答案(7)|浏览(287)

我使用Java(使用Spring框架),并希望在IPv4地址的数字表示(例如2130706433)和它们的文本对应物(例如127.0.0.1)。通常,在编程语言中提供了这样做的方法(它们通常分别称为INET_NTOAINET_ATON),但我在Java中找不到它。
有人知道它们叫什么或者如何实现吗?

ybzsozfc

ybzsozfc1#

查看javadoc中的InetAddress。标准API不直接支持这些函数,但您可以使用此类提取这两种表示。举个小例子:

InetAddress address = InetAddress.getLocalHost();
    byte[] byteAddress = address.getAddress();
    System.out.println(Arrays.toString(byteAddress));
    System.out.println(address.getHostAddress());

(Keep注意字节是有符号的。)
如果你有比你长的-s,可以使用ByteBuffer,快速而舒适的转换。方法:putLong()然后array()。

r55awzrz

r55awzrz2#

下面是我自己编写的代码,以获得文本IPv4地址的数字表示:

public static Long ipAsNumeric(String ipAsString) {
    String[] segments = ipAsString.split("\\.");
    return (long) (Long.parseLong(segments[0]) * 16777216L
       + Long.parseLong(segments[1]) * 65536L
       + Long.parseLong(segments[2]) * 256L + 
         Long.parseLong(segments[3]));
}

当然,这假设IPv4地址是以有效格式给出的。

3mpgtkmj

3mpgtkmj3#

java.net.InetAddress.getByAddress(byte[])
与INET_NTOA不完全相同,但与非常相似。
长参数示例:

String ntoa(long raw) {
    byte[] b = new byte[] {(byte)(raw >> 24), (byte)(raw >> 16), (byte)(raw >> 8), (byte)raw};
    try {
        return InetAddress.getByAddress(b).getHostAddress();
    } catch (UnknownHostException e) {
        //No way here
        return null;
    }
}
xn1cxnb4

xn1cxnb44#

使用the IPAddress Java library很简单,每个方向的一行代码适用于IPv4和IPv6。事实上,您可以编写适用于IPv4和IPv6的代码,如下面的第一个示例所示。免责声明:我是那个图书馆的项目经理。
使用byte[]和/或BigInteger的IP版本不可知:

IPAddress loopback = new IPAddressString("::1").getAddress();
    System.out.println(loopback.getValue());
    IPAddress backAgain = new IPAddressGenerator().from(loopback.getBytes());
    System.out.println(backAgain);

对IPv4使用int:

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

对IPv6使用BigInteger:

IPv6Address loopbackv6 = new IPAddressString("::1").getAddress().toIPv6();
    System.out.println(loopbackv6.getValue());
    IPv6Address backAgainv6 = new IPv6Address(loopbackv6.getValue());
    System.out.println(backAgainv6);

输出:

1
    0:0:0:0:0:0:0:1

    2130706433
    127.0.0.1

    1
    0:0:0:0:0:0:0:1
nxowjjhe

nxowjjhe5#

我猜InetAddress会做你想做的事情

8yoxcaq7

8yoxcaq76#

Guava的InetAddresses就可以做到这一点。
查看Going from 127.0.0.1 to 2130706433, and back again中Ido的评论

9q78igpj

9q78igpj7#

请尝试以下代码。

import java.net.InetAddress;
import java.net.UnknownHostException;

public class IpConvertUtil {
    public static long inetAton(String ipAddress) throws UnknownHostException {
        
        InetAddress address = InetAddress.getByName(ipAddress);
        byte[] bytes = address.getAddress();
        long result = 0;
        for (byte b : bytes) {
            result = result << 8 | (b & 0xFF);
        }
        return result;
        
    }
    
    public static String inetNtoa(long address) {
        return (address >> 24 & 0xFF) + "." +
                (address >> 16 & 0xFF) + "." +
                (address >> 8 & 0xFF) + "." +
                (address & 0xFF);
    }
}

相关问题