2

こんにちは、IP ロケーションを選択するためのデータベースを持っています。>

ip2long('127.0.0.1' ));スクリプトはphpにあり、それをJavaに変換していますが、Javaに相当するものはわかりません

4

6 に答える 6

2

基本的に、これはドット付き IP アドレス文字列を長い形式に変換します。

public static Long Dot2LongIP(String dottedIP) {
    String[] addrArray = dottedIP.split("\\.");        
    long num = 0;        
    for (int i=0;i<addrArray.length;i++) {            
        int power = 3-i;            
        num += ((Integer.parseInt(addrArray[i]) % 256) * Math.pow(256,power));        
    }        
    return num;    
}
于 2012-05-29T14:06:48.273 に答える
1

Javaでそれを行うための標準APIはないと思いますが

1 / InetAddressクラスは、バイトの配列を取得するためのメソッドを提供します。

2 /本当に単一の整数が必要な場合は、http://www.myteneo.net/blog/-/blogs/java-ip-address-to-integer-and-back/にあるこのスニペットを使用できます。

public static String intToIp(int i) {
    return ((i >> 24 ) & 0xFF) + "." +

           ((i >> 16 ) & 0xFF) + "." +

           ((i >>  8 ) & 0xFF) + "." +

           ( i        & 0xFF);

}

public static Long ipToInt(String addr) {
    String[] addrArray = addr.split("\\.");

    long num = 0;

    for (int i=0;i<addrArray.length;i++) {

        int power = 3-i;

        num += ((Integer.parseInt(addrArray[i])%256 * Math.pow(256,power)));

    }

    return num;

}
于 2012-05-29T14:10:04.030 に答える
1

文字列をオクテットに変換することから始めます。

static final String DEC_IPV4_PATTERN = "^(([0-1]?\\d{1,2}\\.)|(2[0-4]\\d\\.)|(25[0-5]\\.)){3}(([0-1]?\\d{1,2})|(2[0-4]\\d)|(25[0-5]))$";

static byte[] toOctets(String address){

    if(address==null){
        throw new NullPointerException("The IPv4 address cannot be null.");
    }

    if(!address.matches(DEC_IPV4_PATTERN)){
        throw new IllegalArgumentException(String.format("The IPv4 address is invalid:%s ",address));
    }

    //separate octets into individual strings
    String[] numbers = address.split("\\.");

    //convert octets to bytes.
    byte[] octets = new byte[4];
    for(int i = 0; i < octets.length; i++){
        octets[i] = Integer.valueOf(numbers[i]).byteValue();
    }
    return octets;
}

次に、バイト配列を受け入れるため、オクテットを BigInteger に変換し、そこから整数に変換します。

static int toInteger(byte[] octets){
    if(octets==null){
        throw new NullPointerException("The array of octets cannot be null");
    }

    if(octets.length != 4){
        throw new IllegalArgumentException(String.format("The byte array must contain 4 octets: %d",octets.length));
    }

    return new BigInteger(octets).intValue();
}

ここから、次のことを簡単に実行できます。

String address = "127.0.0.1";
System.out.println(toInteger(toOctets(address)));

または、という名前の関数を作成しますip2long(String address )

于 2012-05-29T14:20:51.287 に答える
0

これは IPv4 と IPv6 で機能します。

public static String toLongString(final String ip) {
    try {
        final InetAddress address = InetAddress.getByName(ip);
        final byte[] bytes = address.getAddress();
        final byte[] uBytes = new byte[bytes.length + 1]; // add one byte at the top to make it unsigned
        System.arraycopy(bytes, 0, uBytes, 1, bytes.length);
        return new BigInteger(uBytes).toString();
    } catch (final UnknownHostException e) {
        throw new IllegalArgumentException(e);
    }
}
于 2016-11-03T15:57:07.293 に答える