2012-03-15 9 views
3

ipAddressがプライベートカテゴリにあるかどうかを確認しています。だから私はこの方法を以下に書いた。そして、私はexception-addrの長さが不正です

java.net.UnknownHostException: addr is of illegal length 
    at java.net.InetAddress.getByAddress(InetAddress.java:948) 
    at java.net.InetAddress.getByAddress(InetAddress.java:1324) 

ipAddressの(172.18.36.81)としてこれを取得しています、私はあなたがStringからbyte[]にIPアドレスを変換する方法を誤解したと思う文字列

if(isPrivateIPAddress(ipAddress)) { 

      return null; 
     } 


private static boolean isPrivateIPAddress(String ipAddress) { 

    byte[] byteArray = null; 
    InetAddress ia = null; 
    try { 
     byteArray = ipAddress.getBytes("UTF-16LE"); 
    } catch (UnsupportedEncodingException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 


    try { 
     ia = InetAddress.getByAddress(byteArray); 
    } catch (UnknownHostException e) { 

     e.printStackTrace(); 
    } 

    return ia.isSiteLocalAddress(); 
} 
+0

'byteArray'の値は何ですか? –

+2

'ipAddress.getBytes(" UTF-16LE ");'? –

+0

'getByAddress'に渡す前に' byteArray'を出力しようとしましたか? –

答えて

8

です。適切な方法は、Stringを一連のintにパーズしてから、それぞれをbyteにキャストすることです。しかし幸い、InetAddressはすでにあなたのためにそれを処理するメソッドを持っているので、あなただけ書くことができます。

private static boolean isPrivateIPAddress(String ipAddress) 
{ 
    return InetAddress.getByName(ipAddress).isSiteLocalAddress();; 
} 

を(一緒にあなたが好きな妥当性チェックとエラー処理で)。

上記はDNSルックアップを使用してホスト名も処理することに注意してください。 IPアドレスを必要としない場合は、次のようにIPアドレスを事前に確認する必要があります。

if(! Pattern.matches("(\\d{1,3}\\.){3}\\d{1,3}", ipAddress) 
    throw new IllegalArgumentException(); 

IPv4のみをサポートしています。

+0

、ありがとうございます。しかし、私はあなたの2番目の部分を得ることができませんでした**ホスト名**、少し説明できますか? – ferhan

+0

@RaihanJamal: 'InetAddress.getByName(String)'はIPアドレスとホスト名の両方を扱うと言っています。ホスト名については、[DNS](http://en.wikipedia.org/wiki/Domain_Name_System)で名前を検索します。あなたの質問から、DNSルックアップをしたくないと思われたので、そのメソッドを呼び出す前に文字列が(ホスト名ではなく)IPアドレスであることを確認する方法を提案しました。 – ruakh

1

このメソッドに渡されるインターネットアドレスは、4バイトまたは16バイトの長さのバイト配列でなければなりません。あなたのデコード後にこれをデバッガで止め、それがどれくらいの長さであるかを見てください。例外は、それがこれら2つのうちの1つではないことを伝えています。次に、エンコーディングを修正する方法を解説します。

関連する問題