我想生成一些随机IP地址。但是evertime这个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
。
答案 0 :(得分:41)
Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
答案 1 :(得分:10)
使用Google Guava:
import com.google.common.net.InetAddresses;
...
String ipString = InetAddresses.fromInteger(random.nextInt()).getHostAddress();
当然,您可以验证生成的地址不是多播等。
答案 2 :(得分:1)
我最近开发了small library,它可以使用不同的类型约束生成随机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]
答案 3 :(得分:1)
要使用Subnet Mask生成随机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);
}
}
答案 4 :(得分:0)
假设您实际上并不关心任何形式的结果IP地址是否有效,那么您就会遇到一个简单的问题。
生成地址的代码将参数p3
和p2
设置为小于255
的值。 p1
被困在255
和0
之间。
真正的问题是将其转换为地址的代码会改变这些值。 p1
24
,p2
16
和p3
8
。了解调用方法中应用的限制,您可以知道p1
,p2
和p3
永远不会超过255
,因此在这种情况下知道{8
的移位1}}或更多将导致0
,地址的各个元素都不会产生除0
以外的值,并且最后一个八位字节将始终为0
,因此结果地址为0.0.0.0
如果您想阻止它0.0.0.0
,首先要做的是删除班次操作。这仍然会将最后一个字段保留为0
,因为它永远不会设置,但它应该生成地址。
同样,这并不关心地址的状态,使用这种方法最终会得到广播,多播和仅限本地的地址。
答案 5 :(得分: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
。 p3
中的Reuslt现在是5
。
条件if (p3 > 255)
将始终失败,因为p3
为5
< 255
...
答案 6 :(得分: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格式。
答案 7 :(得分:0)
我写了一个简短的代码来过滤掉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);
答案 8 :(得分:0)
一种非常简单快捷的生成随机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;
}
}