将四个32位的int转换为java中的IP地址

时间:2012-06-07 18:58:42

标签: java ip type-conversion 32-bit

使用此处的代码: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 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

您可以使用

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

改变这一点。

byte[] addrAsBytes = { (byte) (addr >> 24), (byte) (addr >> 16), 
                (byte) (addr >> 8), (byte) addr };

答案 2 :(得分:1)

Teetoo上面提到的答案值得一些解释。

让我们从第一个值开始:

(ipaddr >> 24) & 0xFF

当向下移位时,表示157的8位位于结果整数的最右侧位置。但是,由于该值最初是负数,因此您将在24个最高有效位中得到1,这最终会给您一个负数。你想要的是除了最后8位以外的所有0,因此是“&amp; 0xFF”。另一种方法是使用&gt;&gt;&gt;右移。运算符强制0进入最高有效位。

(ipaddr >>> 24)

现在我们继续:

(ipaddr >> 16) & 0xFF

当您移动时,您将最左边的16位设置为1(由于移动了负数)。然后你将得到代表157的8位,然后代表166的8位。在这种情况下,&gt;&gt;&gt;运营商不会帮助我们,因为我们仍然有157。所以“&amp; 0xFF”除了166的8位外都将为0。

与最后两个值类似。

答案 3 :(得分:1)

@ Teetoo答案的补充。

ByteBuffer执行int到byte array magic

ByteBuffer bb = ByteBuffer.wrap (addr);
bb.putInt (iIP);