Ответ 1
Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
Я хочу создать случайный IP-адрес. Но в evertime эта функция generateIPAddress возвращает строку 0.0.0.0 как ipAddress. Но он должен возвращать некоторый случайный ipAddress, отличный от 0.0.0.0 каждый раз. Любые предложения, почему это происходит?
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 в основном, так что у меня есть жестко заданные биты 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-адрес действителен в какой-либо форме, у вас есть простая проблема.
Код для создания адресов задает параметры p3
и p2
чем-то меньше 255
. p1
находится в ловушке между 255
и 0
.
Реальная проблема заключается в том, что код, который превращает это в адрес, смещает эти значения. p1
на 24
, p2
на 16
и p3
на 8
. Понимая ограничение, применяемое в вызывающем методе, вы можете знать, что p1
, p2
и p3
никогда не превысят 255
, поэтому в этом случае, зная, что сдвиг 8
или более приведет к 0
, ни один из отдельных элементов адреса не приведет к значению, отличному от 0
, а последний октет всегда будет 0
, поэтому результирующий адрес будет 0.0.0.0
Если вы хотите, чтобы он не был 0.0.0.0
, первое, что нужно сделать, это удалить операции смены. Это все равно будет содержать последнее поле как 0
, потому что оно никогда не устанавливается, но должно вызывать адреса.
Опять же, это не касается состояния адресов, в этом случае вы будете использовать широковещательные, многоадресные и локальные адреса.
Когда вы вызываете generateIPAddress(p1, p2, p3)
, p1
является 255
, p2
и p3
являются 0
.
Эта строка
int b1 = (p1 >> 24) & 0xff;
сдвигает p1
24 бита вправо. До сдвига p1
было 11111111
. Результаты сдвига с 0
. На самом деле вы также можете использовать
int b1 = p1 >> 8;
поскольку p1
имеет только 8 младших значащих бит. Использование & 0xff
избыточно, так как операция находится между двумя операндами int
. Итак, b1
0
.
p2
и p3
передаются со значением 0
, поэтому сдвиг (либо на 16
, либо 8
) не меняет его на один бит, в результате чего b2
и b3
также 0
.
b4
явно установлен на 0
.
Таким образом, все b1
, b2
, b3
и b4
являются 0
, из которых вы создаете ip1
в ip4
. Поэтому метод generateIPAddress(p1, p2, p3)
всегда возвращает 0.0.0.0
.
Затем p3 += inc;
добавляет 5
в 0
. Reuslt в p3
теперь 5
.
Условие if (p3 > 255)
всегда будет терпеть неудачу, поскольку p3
- 5
, который равен < 255
...