生成随机IP地址
我想生成一些随机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(); }
我想以p1,p2,p3
的forms分配给ipAddress
的随机值,最后一位应为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();
当然你可以validation结果地址不是多播等。
要使用子网掩码生成随机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); } }
我最近开发了一个小型库 ,可以使用不同的类型约束生成随机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 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]
假设您实际上并不关心任何forms的结果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位向右移位。 在class次之前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
...