2010-09-21 15 views
5

मैं जानना चाहता हूं कि क्या एक लाइब्रेरी है जिसका उपयोग मैं एक लंबे आईपीवी 6 एड्रेस (जैसे 2002: 9876: 57 एबी: 0000) के पुनर्विचार को बदलने के लिए कर सकता हूं: 0000: 0000: 0000: 0001) संपीड़ित आईपीवी 6 फॉर्म में (इस मामले में: 2002: 9876: 57 एबी :: 1)।जावा लाइब्रेरी को एक लंबे आईपीवी 6 एड्रेस को अपने संपीड़ित रूप में बदलने के लिए

मुझे ऐसी लाइब्रेरी नहीं मिल सका। इस पुस्तकालय को किसी भी आईपी एपीआई का उपयोग नहीं करना चाहिए, एक नेटवर्क कनेक्शन नहीं बनाया जाना चाहिए।

मैं पहले से ही

return Inet6Address.getByName(longAdress).toString(); 

कोशिश की, लेकिन यह सिर्फ 1 शून्य के साथ 4 शून्य की जगह (इस मामले में 2002 में: 9876: 57AB: 0: 0: 0: 0: 1)।

कोई सुझाव?

+0

भी देखें http://stackoverflow.com/q/7043983/21499 –

उत्तर

2
public class Ipv6AddressCompressor { 
    public static String getCompressedAddress(String longAddress) throws UnknownHostException { 
     longAddress = Inet6Address.getByName(longAddress).getHostAddress(); 
     return longAddress.replaceFirst("(^|:)(0+(:|$)){2,8}", "::"); 
    } 
} 

यह अवैध पते (UnknownHostException फेंकता) से आपकी सुरक्षा करने चाहिए, और ठीक से IPv4 पतों अनुगामी सेक होगा (यानी 0: 0: 0: 0: 0: 0: 255.255.255.255 -> :: FFFF: FFFF)। यह पहले से संकुचित पते के खिलाफ भी रक्षा करेगा।

+2

छोड़कर यह निरर्थक शून्य, जैसे को दूर नहीं करता, ' 0000: 0000: 0001' ':: 1' होना चाहिए लेकिन' :: 0001' बन जाता है - 'replaceAll ("::^^) 0 + (\\ d)", "$ 1 $ 2") जैसे कुछ करने से ठीक करने योग्य नतीजतन, हालांकि। – gustafc

+0

अच्छी पकड़। आपका \\ डी होना चाहिए [0-9 ए-एफए-एफ] हालांकि। ठीक करने के लिए अद्यतन होगा। –

+0

सावधानी: यदि आप फ़ीड करते हैं तो Inet6Address.getByName DNS क्वेरी का कारण बन सकता है। एक टूटा हुआ पता जैसे ":: 1 ::"। इसमें एक ही कॉल पर कुछ सेकंड लग सकते हैं! –

0

आप इस कोड को आजमा सकते हैं। यह शायद रेगेक्स समकक्ष से बेहतर प्रदर्शन करेगा (ऐसा नहीं है कि मैंने इसे बेंचमार्क किया है, या कुछ भी)। यह भी बहुत अच्छी तरह से परीक्षण किया गया है।

ध्यान दें कि आपको आईपी पते के एक संख्यात्मक प्रतिनिधित्व (byte[] में) का उपयोग करने की आवश्यकता होगी। इसे प्राप्त करने के लिए आप या तो InetAddress.getByName(ip).getAddress() कर सकते हैं यदि आपको मेजबान नामों को हल करने की आवश्यकता है, या मेजबान रिज़ॉल्यूशन के बिना किसी आईपी पते से पार्स करने के लिए सूर्य उपयोगिता वर्गका उपयोग करें।

private static final char[] ipv6conseqZeroFiller = { ':', ':' }; 
private static final char ipv6hextetSeparator = ':'; 

/* 
* Convert numeric IPv6 to compressed format, where 
* the longest sequence of 0's (with 2 or more 0's) is replaced with "::" 
*/ 
public static String ipv6toCompressedForm(byte[] src) { 
    assert src.length == 16; 
    //Find the longest sequence of 0's 
    int cmprHextet = -1; //start of compressed region (hextet index) 
    int cmprSize = 0; //length of compressed region 
    for (int hextet = 0; hextet < 8;) { 
     int curByte = hextet * 2; 
     int size = 0; 
     while (curByte < src.length && src[curByte] == 0 
       && src[curByte + 1] == 0) { 
      curByte += 2; 
      size++; 
     } 
     if (size > cmprSize) { 
      cmprHextet = hextet; 
      cmprSize = size; 
     } 
     hextet = (curByte/2) + 1; 
    } 
    if (cmprHextet == -1 || cmprSize < 2) { 
     //No compression can be applied 
     return ipv6toStr(src); 
    } 
    StringBuilder sb = new StringBuilder(39); 
    ipv6toStr(sb, src, 0, cmprHextet); 
    sb.append(ipv6conseqZeroFiller); 
    ipv6toStr(sb, src, cmprHextet + cmprSize, 8); 
    return sb.toString(); 
} 

/* 
* Convert numeric IPv6 to standard (non-compressed) format. 
* 
* Borrowed from Inet6Address.java #numericToTextFormat(byte[]) 
* Changed StringBuffer -> StringBuilder and ":" -> ':' for performance. 
*/ 
public static String ipv6toStr(byte[] src) { 
    assert src.length == 16; 
    StringBuilder sb = new StringBuilder(39); 
    ipv6toStr(sb, src, 0, 8); 
    return sb.toString(); 
} 

private static final void ipv6toStr(StringBuilder sb, byte[] src, 
     int fromHextet, int toHextet) { 
    for (int i = fromHextet; i < toHextet; i++) { 
     sb.append(Integer.toHexString(((src[i << 1] << 8) & 0xff00) 
       | (src[(i << 1) + 1] & 0xff))); 
     if (i < toHextet - 1) { 
      sb.append(ipv6hextetSeparator); 
     } 
    } 
} 
5

java-ipv6 इसके लिए एक बहुत ही सभ्य पुस्तकालय है। यह पते को अच्छी तरह से संभालता है।

1

The open-source IPAddress Java library आईपी पता पार्सिंग कर सकते हैं और विभिन्न तारों का उत्पादन कर सकते हैं। अस्वीकरण: मैं उस पुस्तकालय का प्रोजेक्ट मैनेजर हूं।

उदाहरण कोड:

String ipv6 = "2002:9876:57AB:0000:0000:0000:0000:0001"; 
    try { 
     IPAddressString str = new IPAddressString(ipv6); 
     IPAddress addr = str.toAddress(); 
     String compressed = addr.toCompressedString(); 
     System.out.println(compressed); // 
    } catch(IPAddressStringException e) { 
     //e.getMessage has validation error 
    } 

उत्पादन:

2002:9876:57ab::1 
संबंधित मुद्दे