ランダムなIPアドレスを生成したい。ただし、このgenerateIPAddress関数は常に0.0.0.0文字列をipAddressとして返します。ただし、毎回0.0.0.0以外のランダムなipAddressを返す必要があります。なぜそれが起こっているのですか?
private void callingGeoService() {
int p1 = 255;
int p2 = 0;
int p3 = 0;
int inc = 5;
String ipAddress = generateIPAddress(p1, p2, p3);
p3 += inc;
if (p3 > 255) {
p3 = 0;
p2 += inc;
if (p2 > 255) {
p2 = 0;
p1--;
if (p1 <= 0) {
p1 = 0;
}
}
}
}
これはgenerateIPAddressメソッドです
private String generateIPAddress(int p1, int p2, int p3) {
StringBuilder sb = null;
int b1 = (p1 >> 24) & 0xff;
int b2 = (p2 >> 16) & 0xff;
int b3 = (p3 >> 8) & 0xff;
int b4 = 0;
String ip1 = Integer.toString(b1);
String ip2 = Integer.toString(b2);
String ip3 = Integer.toString(b3);
String ip4 = Integer.toString(b4);
//Now the IP is b1.b2.b3.b4
sb = new StringBuilder();
sb.append(ip1).append(".").append(ip2).append(".").append(ip3).append(".").append(ip4);
// System.out.println(sb);
return sb.toString();
}
ipAddress
にp1,p2,p3
の形式でランダムな値を割り当て、最後のビットを0
にする必要があります。
Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
使用 Google Guava :
import com.google.common.net.InetAddresses;
...
String ipString = InetAddresses.fromInteger(random.nextInt()).getHostAddress();
もちろん、結果のアドレスをマルチキャストなどではないことを検証できます。
私は最近、さまざまなタイプの制約を使用してランダムなIPv4アドレスを生成できる 小さなライブラリ を開発しました。
MockNeat mock = MockNeat.threadLocal();
String ipv4 = mock.ipv4s().val();
System.out.println(ipv4);
String ipClassA = mock.ipv4s().type(CLASS_A).val();
System.out.println(ipClassA);
String classAorB = mock.ipv4s().types(CLASS_A, CLASS_B).val();
System.out.println(classAorB);
List<String> ip4s = mock.ipv4s().list(10).val();
System.out.println(ip4s);
出力:
192.112.222.183
120.178.110.193
143.68.176.47
[112.246.76.178, 29.201.72.151, 67.105.2.128, 102.189.109.206, 157.146.176.212, 59.220.145.35, 47.171.185.233, 162.245.163.124, 19.203.21.194, 114.177.238.50]
サブネットマスク でランダムIPアドレスを生成するには、以下のコードを使用します(このコードではサブネットマスクに [〜#〜] cidr [〜#〜] 形式):
import Java.util.Random;
import Java.util.Scanner;
public class mainClas {
public static int findRange(int mask)
{
int x = 8 - mask;
int sum = 0;
for (int i = 0 ; i < x ; i++) {
sum += Math.pow(2 , i);
}
return sum;
}
public static int findFixedPart(String IPPrefix, int i)
{
String f = IPPrefix.split("\\.")[i];
return Integer.valueOf(f);
}
public static String generateRandomIP(String IPPrefix, Integer mask)
{
String IP="";
Random r = new Random();
if (mask < 8)
IP = (findFixedPart(IPPrefix, 0) + r.nextInt(findRange(mask))) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
else if (mask >7 && mask < 16)
IP = findFixedPart(IPPrefix, 0) + "." + (findFixedPart(IPPrefix, 1) + r.nextInt(findRange(mask-8))) + "." + r.nextInt(256) + "." + r.nextInt(256);
else if (mask >15 && mask < 24)
IP = findFixedPart(IPPrefix, 0) + "." + findFixedPart(IPPrefix, 1) + "." + (findFixedPart(IPPrefix, 2) + r.nextInt(findRange(mask-16))) + "." + r.nextInt(256);
else if (mask >23 && mask < 33)
IP = findFixedPart(IPPrefix, 0) + "." + findFixedPart(IPPrefix, 1) + "." + findFixedPart(IPPrefix, 2) + "." + (findFixedPart(IPPrefix, 3) + r.nextInt(findRange(mask-24)));
return IP;
}
public static void main(String[] inpout)
{
System.out.println("Enter IP Prefix: ");
Scanner sc = new Scanner(System.in);
String IPPrefix = sc.nextLine();
System.out.println("Enter Mask: ");
Integer mask = sc.nextInt();
// Find random IP in Subnet mask
String IP = generateRandomIP(IPPrefix, mask);
System.out.println(IP);
}
}
結果として得られるIPアドレスがどのような形式でも有効であることを実際に気にしないと仮定すると、単純な問題が発生します。
アドレスを生成するためのコードは、パラメーター_p3
_および_p2
_を_255
_未満に設定します。 _p1
_は_255
_と_0
_の間に閉じ込められています。
本当の問題は、これをアドレスに変換するコードがこれらの値をシフトすることです。 _p1
_ by _24
_、_p2
_ by _16
_および_p3
_ by _8
_。呼び出しメソッドに適用される制限を理解すると、_p1
_、_p2
_、および_p3
_が_255
_を超えることはないため、この場合は_8
_のシフトがわかります。 SOMECODE)__以上の結果は_0
_になり、アドレスの個々の要素のいずれも_0
_以外の値にはならず、最後のオクテットは常に_0
_になるため、結果のアドレスは_0.0.0.0
_になります
_0.0.0.0
_にならないようにする場合は、最初にシフト操作を削除します。これにより、最後のフィールドは設定されないため、_0
_のままになりますが、アドレスが生成されるはずです。
繰り返しますが、これはアドレスの状態を気にしません。この方法を使用すると、ブロードキャスト、マルチキャスト、およびローカルのみのアドレスになります。
この関数は、無限の数のランダムIPアドレスを生成するのに役立ちます。
StringBuilder ip = new StringBuilder("xx.xx.xx.xx");
for (int i=0 ; i <11;i++){
if (i==2){}
else if (i==5){}
else if (i==8){}
else{
Random r = new Random();
int random = r.nextInt((9 - 1) + 1) + 1;
char c = (char)(random+'0');
ip.setCharAt(i, c);
}
}
Log.v("ip","Server IP : "+ip);
ご覧のとおり、私はxx.xx.xx.xx ip形式を生成し、それを処理して任意のip形式を生成できます。
ランダムなIPアドレスを生成する非常に簡単で高速な方法:
import Java.util.Random;
public class IpAddressHelper {
public static String createRandom() {
return randomNumber() + "." + randomNumber() + "." + randomNumber() + "." + randomNumber();
}
public static int randomNumber() {
return new Random().nextInt((255 - 1) + 1) + 1;
}
}
wikipedia にリストされている範囲を特別なものとして除外する短いコードを作成しました(最初のオクテットのみに基づいているため、少し多くなります)。
Random r = new Random();
Integer prefix;
while ({
prefix = r.nextInt(256);
prefix in [0,10,100,127,172,192,198,203,224,240,255]
}());
return prefix + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);