4

皆さん、

指定された IP から次のアドレスを取得する Java コード スニペットを探しています。

そうgetNextIPV4Address("10.1.1.1")戻ります"10.1.1.2"

文字列のクランチは実行できますが、乱雑になる可能性があります。これを行うための非常に形式化された方法はありますか。

御時間ありがとうございます。

4

7 に答える 7

8

指定された IP から次のアドレスを取得する Java コード スニペットを探しています。

ここにあなたのためのスニペットがあります:

public static String getNextIPV4Address(String ip) {
    String[] nums = ip.split("\\.");
    int i = (Integer.parseInt(nums[0]) << 24 | Integer.parseInt(nums[2]) << 8
          |  Integer.parseInt(nums[1]) << 16 | Integer.parseInt(nums[3])) + 1;

    // If you wish to skip over .255 addresses.
    if ((byte) i == -1) i++;

    return String.format("%d.%d.%d.%d", i >>> 24 & 0xFF, i >> 16 & 0xFF,
                                        i >>   8 & 0xFF, i >>  0 & 0xFF);
}

入力/出力の例( ideone.com デモンストレーション):

10.1.1.0        -> 10.1.1.1
10.255.255.255  -> 11.0.0.0
10.0.255.254    -> 10.1.0.0
于 2011-06-09T15:59:39.983 に答える
4

IP アドレスは「シーケンシャル」ではないため、それを行うためのライブラリが見つかるとは思えません。

于 2011-06-09T15:51:16.027 に答える
3

IP アドレスは、ほとんど 32 ビットの整数です。保存方法によっては、この基礎となる値を単純にインクリメントできる場合があります。ただし、サブネットや異なるアドレス クラスなどを考慮する必要があるため、これはおそらくあまり信頼できません。

dty が指摘しているように、IP アドレスは連続していないため、これを行うための「正式な」方法はないと思います。

于 2011-06-09T15:53:13.837 に答える
3

これで始められます(エラー処理、コーナーケースなどを追加してください):

public static final String nextIpAddress(final String input) {
    final String[] tokens = input.split("\\.");
    if (tokens.length != 4)
        throw new IllegalArgumentException();
    for (int i = tokens.length - 1; i >= 0; i--) {
        final int item = Integer.parseInt(tokens[i]);
        if (item < 255) {
            tokens[i] = String.valueOf(item + 1);
            for (int j = i + 1; j < 4; j++) {
                tokens[j] = "0";
            }
            break;
        }
    }
    return new StringBuilder()
    .append(tokens[0]).append('.')
    .append(tokens[1]).append('.')
    .append(tokens[2]).append('.')
    .append(tokens[3])
    .toString();
}

テストケース:

@Test
public void testNextIpAddress() {
    assertEquals("1.2.3.5", nextIpAddress("1.2.3.4"));
    assertEquals("1.2.4.0", nextIpAddress("1.2.3.255"));
}
于 2011-06-09T16:02:37.333 に答える
1

で分割し.、最後の要素を int にキャストしてインクリメントします。その値が 254 未満であるかどうかを確認してください。さもなければ、ブロードキャスト アドレスを獲得できます。常に完全なクラス C サブネットを扱っていることを祈ります。

于 2011-06-09T15:56:24.640 に答える
0

文字列を「.」で分割します。4 つの文字列をバイトに変換します。int 乗算を取得するには、すべてのバイトを乗算します。結果を増やします。整数を分割し、各バイトに mod を格納して、バイトを復元します。バイトを文字列に変換し、すべての文字列を連結します。

于 2011-06-09T15:56:17.680 に答える