3

ここにあるコードを使用: https://libbits.wordpress.com/2011/05/17/check-if-ip-is-within-range-specified-in-cidr-in-java/

  // Step 1. Convert IPs into ints (32 bits). 
// E.g. 157.166.224.26 becomes 10011101  10100110  11100000 00011010
int addr = (( 157 << 24 ) & 0xFF000000) 
           | (( 166 << 16 ) & 0xFF0000) 
           | (( 224 << 8 ) & 0xFF00) 
           |  ( 26 & 0xFF);

// Step 2. Get CIDR mask
int mask = (-1) << (32 - 10);

// Step 3. Find lowest IP address
int lowest = addr & mask;

// Step 4. Find highest IP address
int highest = lowest + (~mask);

文字列を 4 つの整数に分割し、IP 範囲の境界を作成できます。今、最高値と最低値の間にあるIPを生成できるようにしたいと考えています。例: 範囲: 157.166.224.26/10 を指定すると、-1650008038 のアドレスが取得されます。私の最小 IP アドレスは -1652555776 で、最大 IP アドレスは -1648361473 です。ここで、最小値と最大値の間の数値を生成し、それを 4 つの整数に変換する必要があります。この最後の部分で迷っています。-1648361473 を IP アドレスに変換する方法がわかりません。

4

4 に答える 4

5

それはとても簡単です。IPv4アドレスがipaddr変数にあるとしましょう。次のように書くことができます:

byte[] addr = new byte[4];
addr[0] = (ipaddr >> 24) & 0xFF;
addr[1] = (ipaddr >> 16) & 0xFF;
addr[2] = (ipaddr >> 8 ) & 0xFF;
addr[3] = ipaddr & 0xFF;

InetAddress inetAddr = InetAddress.getByAddress(addr);
于 2012-06-07T19:14:32.290 に答える
1

上記の Teetoo の回答は、説明に値します。

最初の値から始めましょう:

(ipaddr >> 24) & 0xFF

これを下にシフトすると、157 を表す 8 ビットが結果の整数の右端に位置します。ただし、値は最初は負だったので、最上位 24 ビットに 1 があり、最終的には負の数になります。あなたが望むのは、最後の8ビットを除くすべてを0にすることです。したがって、「& 0xFF」です。これを行う別の方法は、最上位ビットに 0 を強制する >>> 演算子を使用して右シフトすることです。

(ipaddr >>> 24)

次に進みます。

(ipaddr >> 16) & 0xFF

シフトすると、左端の 16 ビットが 1 に設定されます (負の数をシフトするため)。次に、157 を表す 8 ビットと、166 を表す 8 ビットがあります。この場合、157 がまだそこにあるため、>>> 演算子は役に立ちません。したがって、「& 0xFF」は、166 の 8 ビットを除くすべてを 0 にします。

最後の 2 つの値についても同様です。

于 2012-06-07T19:47:51.210 に答える
1

@Teetooの回答への追加。

ByteBufferint からバイト配列へのマジックをしましょう

ByteBuffer bb = ByteBuffer.wrap (addr);
bb.putInt (iIP);
于 2012-06-07T19:52:29.777 に答える
1

使用できます

int addr = (157 << 24) | (166 << 16) | (224 << 8) | 26;

これを逆にする。

byte[] addrAsBytes = { (byte) (addr >> 24), (byte) (addr >> 16), 
                (byte) (addr >> 8), (byte) addr };
于 2012-06-07T19:21:33.470 に答える