2

私はJavaが初めてで、Javaを使用してプロジェクトを行っています。

IP (例: 192.168.0.10) とサブネット マスク ( としましょう255.255.255.0) があります。このサブネット内のすべての IP アドレスのリストが必要です。私が最もよく考えることができるのは、素朴な解決策です(ビットとすべてを処理する必要があります)。これを行うためのより良い/ e.legantな方法を知っている人はいますか?

例を考えると、IPのリストが次のようになります192.168.0.1. 192.168.0.2, 192.168.0.3, ..... , 192.168.0.254

どんな助けでも感謝します。

[編集] 私が考えた素朴なアプローチ:

所有している IP アドレスとサブネットを考慮して整数を作成します。私たちの場合、これはバイナリ表現になります11000000.10101000.00000000.00000000(読みやすくするためにドットが追加されています)。左トグルから 24 ビットまで、この数値を 1 ずつ増やします。切り替えられる最初のタイルでは、このサブネットで可能な ip である可能性のあるすべての数値が生成されています。ここでのタスクは、32 ビットの数値から ip を生成することです。これは、一度に 8 ビットを抽出する関数を作成することで実行できます。

4

2 に答える 2

3

Apache Commons SubnetUtilsがあります

SubnetUtils utils = new SubnetUtils("192.168.0.10", "255.255.255.0");
String[] addresses = utils.getInfo().getAllAddresses();

getHighAddressあなたにとって非常にgetLowAddress役立つかもしれません。ドキュメントで詳細を参照してください。

于 2012-12-14T15:04:37.167 に答える
1

これはどう?

更新: 2 つの特殊な目的の IP (ネットワーク IP とブロードキャスト IP) の列挙を防ぐための小さな調整。これは、余分な依存関係のない最も単純なソリューションだと思います。

最終更新:符号付き除算の丸めに関する Java の規則を説明するために修正を行いました。

public class ListIPs
{
    static int IPNum(int a, int b, int c, int d)
    {
        int ip = ((a * 256 | b) * 256 | c) * 256 | d;
        return ip;
    }

    static void ListIPs(int ip, int mask)
    {
        int index;
        int count = 1;
        int temp = mask;
        long a, b, c, d;

        while ((temp & 1) == 0)
        {
            count *= 2;
            temp >>= 1;
        }

        for (index = 1; index < count -1; index++)
        {
            long newIP = ((ip & mask) | index) & 0xFFFFFFFFL;


            d = newIP & 0xFF;
            c = (newIP / 256) & 0xFF;
            b = (newIP / 65536) & 0xFF;
            a = (newIP / 16777216) & 0xFF;

            System.out.println("" + a + "." + b + "." + c + "." + d);
        }
    }

    public static void main(String[] args)
    {
        ListIPs(IPNum(192, 168, 0, 10), IPNum(255, 255, 255, 0));
    }
}
于 2012-12-14T15:09:55.577 に答える