3

以下のサンプルコードでは、初心者の開発者に説明するのと同じように、以下の行が実際に何をしているのかをより詳細に説明することができます。

for (byte octet : octets) {
        result <<= 8;
        result |= octet & 0xff;
    }



public class Example {
public static long ipToLong(InetAddress ip) {
    byte[] octets = ip.getAddress();
    long result = 0;
    for (byte octet : octets) {
        result <<= 8;
        result |= octet & 0xff;
    }
    return result;
}

public static void main(String[] args) throws UnknownHostException {
    long ipLo = ipToLong(InetAddress.getByName("192.200.0.0"));
    long ipHi = ipToLong(InetAddress.getByName("192.255.0.0"));
    long ipToTest = ipToLong(InetAddress.getByName("192.200.3.0"));

    System.out.println(ipToTest >= ipLo && ipToTest <= ipHi);
}

}

4

1 に答える 1

2
  • byte[] octets = ip.getAddress();->IPアドレス全体をバイト配列として格納します

  • for (byte octet : octets) {}->バイト配列をオクテットに分割し、それらを反復処理します

  • result <<= 8 (shorthand for result = result<<8)->左シフト8ビットは、結果を2進数で8ビットシフトし、8つの後続ゼロを追加します。(結果の値に2 ^ 8を掛けます)

  • result |= octet & 0xff; (same as result|=octet which is shorthand for result = result | or octect->ビット単位のOR演算。この場合の加算と同じresultです。これは、前のステップの後、の最後に8つのゼロがあるためです。

編集(@jtahlbornに感謝)->ビット単位-バイトがintに変換されるときに符号拡張を回避するには、0xFFを使用する必要があります。

192.200.3.0問題のIPアドレスです。最終的な値は次のとおりです。これは次の方法で生成されます

192*(2^24) + 200*(2^16) + 3*(2^8) + 0*(2^0)
3221225472 + 13107200 + 768 = 3234333440

これでコードは同じように動作しますが、バイナリでビット単位のシフト192を使用するのは11000000です。まず、result=0に追加されます。結果は今11000000です。次に、左に8ビットシフトします(実質的に2 ^ 8を掛けます)。結果は次のようになります。11000000 00000000

これで、バイナリ値20011001000が追加され、結果が得られ11000000 11001000 ます。次の32ビット数が得られるまで、このプロセスが 続行されます。11000000 11001000 00000011 00000000これは、同じ3234333440に変換されます。

于 2012-07-18T20:13:51.763 に答える