0

2 つのアドレス (「168.200.197.3」と「238.199.200.78」) の間のすべての IP アドレスを取得しようとしています。最初に文字列を整数に分割しました。次に、これら2つの間のすべてのアドレスを印刷しようとしました。しかし、出力は、168 169 170 のように、アドレスの各部分がインクリメントされていることを示しているだけです。 )。助けてください !!!!!!!

public class IpAddress {


 public static void main(String[] args) {
    int [] ip1 = new int[4];
    int [] ip2 = new int[4];

    String [] parts1 = "168.200.197.3".split("\\.");
    String [] parts2 = "238.199.200.78".split("\\.");

    for (int i = 0; i <4; i++){
        ip1[i] = Integer.parseInt(parts1[i]);   
              for (int j = 0; j<4; j ++){
                    ip2[j] = Integer.parseInt(parts2[j]);
                           for (int k = ip1[i]; k<ip2[j]; k++){
                                  System.out.println(k);
                                        }
                                 }  
                        }
      }
}
4

2 に答える 2

4

のような IPv4 アドレスa.b.c.dは、符号なし整数で表すことができますa*256^3+b*256^2+c*256+d。これで、2 つの IP アドレスを符号なし整数に変換して、整数範囲を取得し、範囲を反復して、各符号なし整数を IPv4 リテラルに戻すことができます。

于 2013-10-31T03:06:40.650 に答える
1

私だったら、IP アドレスを表す値を使用してこれを行い、IPの文字列表現にint変換する関数を記述します。int

private static final String getIPFromInt(final long ipaslong) {
    return String.format("%d.%d.%d.%d",
                (ipaslong >>> 24) & 0xff,
                (ipaslong >>> 16) & 0xff,
                (ipaslong >>>  8) & 0xff,
                (ipaslong       ) & 0xff);
}

次に、開始点と終了点を int 表現に変換して計算し (getIPFromLong(...) メソッドとは逆の問題です。これは演習として残します)、最後に単純なループを記述します。

final long from = getLongFromIP(ip1);
final long to = getLongFromIP(ip2);

for (long i = from; i <= to, i++) {
    System.out.println(getIPFromLong(i);
}

編集: ループ引数を long に変更し、整数符号ビットの問題を回避する代わりにi、他のメソッドを受け入れるようにしました。longint

于 2013-10-31T03:05:22.130 に答える