3

使用此处找到的代码:https ://libbits.wordpress.com/2011/05/17/check-if-ip-is-within-range-specified-in-cidr-in-java/

  // Step 1. Convert IPs into ints (32 bits). 
// E.g. 157.166.224.26 becomes 10011101  10100110  11100000 00011010
int addr = (( 157 << 24 ) & 0xFF000000) 
           | (( 166 << 16 ) & 0xFF0000) 
           | (( 224 << 8 ) & 0xFF00) 
           |  ( 26 & 0xFF);

// Step 2. Get CIDR mask
int mask = (-1) << (32 - 10);

// Step 3. Find lowest IP address
int lowest = addr & mask;

// Step 4. Find highest IP address
int highest = lowest + (~mask);

我能够将一个字符串拆分为四个整数并为我的 IP 范围创建边界。现在我希望能够生成一个介于最高值和最低值之间的 ip。例如:给定范围:157.166.224.26/10 我得到一个地址 -1650008038 我的最低 IP 地址是 -1652555776,最高 IP 地址是 -1648361473。现在我需要生成一个介于最低和最高之间的数字并将其转换回四个整数,这最后一部分是我迷路的地方,我不知道如何将 -1648361473 转换为 IP 地址

4

4 回答 4

5

这很容易。假设 IPv4 地址在ipaddr变量中,你可以这样写:

byte[] addr = new byte[4];
addr[0] = (ipaddr >> 24) & 0xFF;
addr[1] = (ipaddr >> 16) & 0xFF;
addr[2] = (ipaddr >> 8 ) & 0xFF;
addr[3] = ipaddr & 0xFF;

InetAddress inetAddr = InetAddress.getByAddress(addr);
于 2012-06-07T19:14:32.290 回答
1

您可以使用

int addr = (157 << 24) | (166 << 16) | (224 << 8) | 26;

扭转这一点。

byte[] addrAsBytes = { (byte) (addr >> 24), (byte) (addr >> 16), 
                (byte) (addr >> 8), (byte) addr };
于 2012-06-07T19:21:33.470 回答
1

Teetoo 上面给出的答案值得一些解释。

让我们从第一个值开始:

(ipaddr >> 24) & 0xFF

当它向下移动时,代表 157 的 8 位位于结果整数的最右边。但是,由于该值最初为负数,因此 24 个最高有效位中的 1 将最终给您一个负数。您想要的是除最后 8 位之外的所有内容,因此为“& 0xFF”。另一种方法是使用 >>> 运算符右移,该运算符将 0 强制为最高有效位。

(ipaddr >>> 24)

现在我们继续:

(ipaddr >> 16) & 0xFF

移位时,您会将最左边的 16 位设置为 1(由于移位负数)。然后你会得到代表 157 的 8 位,然后是代表 166 的 8 位。在这种情况下,>>> 运算符对我们没有帮助,因为我们仍然有 157。因此,“& 0xFF”将 0 除了 166 的 8 位之外的所有内容。

最后两个值也是如此。

于 2012-06-07T19:47:51.210 回答
1

@Teetoo 的答案的补充。

让我们ByteBuffer做 int 到字节数组的魔法

ByteBuffer bb = ByteBuffer.wrap (addr);
bb.putInt (iIP);
于 2012-06-07T19:52:29.777 回答