2012-02-03 21 views
6

Tôi sử dụng Java (với khung công tác Spring) và muốn chuyển đổi giữa các đại diện số của địa chỉ IPv4 (ví dụ: 2130706433) và các đối tác văn bản của chúng (ví dụ: 127.0.0.1). Thông thường, các phương pháp để làm điều này được cung cấp trong ngôn ngữ lập trình (chúng thường được gọi là INET_NTOAINET_ATON tương ứng) nhưng tôi không thể tìm thấy nó trong Java.INET_NTOA và INET_ATON trong Java?

Bất kỳ ai biết họ được gọi gì hoặc cách triển khai chúng?

Trả lời

4

Nhìn vào InetAddress trong javadocs. Các hàm này không được API chuẩn hỗ trợ trực tiếp nhưng bạn có thể trích xuất cả hai biểu diễn bằng cách sử dụng lớp này. Một ví dụ nhỏ:

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

(Hãy nhớ rằng byte được ký kết.)


Nếu bạn có dài hơn s yo có thể sử dụng ByteBuffer, cho coversion nhanh và thoải mái. Phương thức: putLong() rồi mảng().

+0

Cảm ơn, có vẻ như là một cách hiệu quả để khám phá.Có vẻ như không có phương pháp nào làm những gì tôi muốn ngay lập tức. – Gruber

3

java.net.InetAddress.getByAddress(byte[])

Không chính xác giống như INET_NTOA, nhưng rất giống với.

Ví dụ với lập luận dài:

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

Cảm ơn. Sẽ rất hay khi có một hàm nhận tham số 'long'. – Gruber

+0

Bạn có thể sử dụng [ByteBuffer] (http://docs.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html). Phương thức: putLong() rồi mảng() – zeller

2

Đây là những gì tôi đã viết bản thân mình để có được một số đại diện của một địa chỉ IPv4 văn bản:

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

Tất nhiên, điều này giả sử địa chỉ IPv4 được đưa ra trên một định dạng hợp lệ.

0

Sử dụng the IPAddress Java library nó rất đơn giản, một dòng mã cho mỗi hướng làm việc cho cả IPv4 và IPv6. Trong thực tế, bạn có thể viết mã hoạt động cho cả IPv4 và IPv6 như trong ví dụ đầu tiên bên dưới. Tuyên bố từ chối trách nhiệm: Tôi là người quản lý dự án của thư viện đó.

IP phiên bản bất khả tri sử dụng byte [] và/hoặc BigInteger:

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

Sử dụng ints cho IPv4:

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

Sử dụng BigInteger cho IPv6:

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

Output:

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

    2130706433 
    127.0.0.1 

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