IP地址转换为十进制和十进制转换为IP地址

3
假设我的十进制数字是9766322441,相应的IP地址是70.30.65.9,但是当这个IP地址转换回去时,它给出了一个不同的十进制数1176387849... 当我将google.com的IP地址(即64.233.187.99)转换后,它给出了1089059683,反向转换则给出了正确的IP地址,即64.233.187.99...

我的问题是上述数字有什么问题?我也尝试过9579342332,但结果相同。它给出了错误的反向转换?

这是什么原因?

您可以使用此计算器进行计算。


根据一些答案的评论,OP试图将电话号码转换为IP地址,这是不可能的。这是两个完全不相关的值。 - Francisco Zarabozo
7个回答

19

您有不正确的值,70.30.65.9将与1176387849对应,但永远不会与9766322441对应。

32位的限制 - Java:如何将十进制转换为32位int?

C++将IP转换为十进制的示例:

#include <iostream.h>

main()
{
    // Initialize the variables
    unsigned long a,b,c,d,base10IP;

    // Get the IP address from user
    cout << "\nEnter an IP address in dotted quad notation (x.x.x.x)";
    cout << "\nwith each section seperated by a space: ";
    cin >> a >> b >> c >> d;

    // Do calculations to convert IP to base 10
    a *= 16777216;
    b *= 65536;
    c *= 256;
    base10IP = a + b + c + d;

    // Output new IP address
    cout << "\nThe converted address is: " << base10IP << '\n';
   }
这是一个用JAVA编写的将IP地址转换为十进制数的类:-
/**
 * @author Charles Johnson
 * from http://www.technojeeves.com/joomla/index.php/free/58-convert-ip-address-to-number
*/
public class IpConverter {
  public static void main(String[] args) {
    System.out.println(longToIp(Long.valueOf(args[0], 16)));
  }

  public static String toHex(String ipAddress) {
    return Long.toHexString(IpConverter.ipToLong(ipAddress));
  }

  public static long ipToLong(String ipAddress) {
    long result = 0;
    String[] atoms = ipAddress.split("\\.");

    for (int i = 3; i >= 0; i--) {
        result |= (Long.parseLong(atoms[3 - i]) << (i * 8));
    }

    return result & 0xFFFFFFFF;
  }

  public static String longToIp(long ip) {
    StringBuilder sb = new StringBuilder(15);

    for (int i = 0; i < 4; i++) {
        sb.insert(0, Long.toString(ip & 0xff));

        if (i < 3) {
            sb.insert(0, '.');
        }

        ip >>= 8;
    }

    return sb.toString();
  }
}
另一个将IP转换为十进制的JAVA示例: - String ip="70.30.65.9"; String[] addrArray = ip.split("\."); long num = 0; for (int i = 0; i 将IP转换为十进制的PHP函数: - function myip2long($ip) { if (is_numeric($ip)) { return sprintf( "%u", floatval($ip) ); } else { return sprintf( "%u", floatval(ip2long($ip) )); } } 尝试将其应用,例如:
echo myip2long("192.168.1.1"); 另一个将IP转换为十进制的PHP示例: - function myip2long2($ip){ $d = 0.0; $b = explode(".", $ip,4); for ($i = 0; $i 将十进制数转换回IP的PHP示例: - function customLong2ip($ip){ $b=array(0,0,0,0); $c = 16777216.0; $ip += 0.0; for ($i = 0; $i

1
请阅读以下内容:http://stackoverflow.com/questions/4984130/java-how-to-convert-dec-to-32bit-int - Ilia
PHP内置的ip2long()和long2ip()函数怎么样? - MarkHu
请注意你的Java类示例中main()方法有误 - 基数应为10而不是16。此外,只使用Long.parseLong( String str )即可正常工作。 - mvreijn
@IliaRostovtsev 我已经翻译了,欢迎您接受它 :-D - mvreijn
@mvreijn 我看不到任何拉取请求? - Ilia
显示剩余5条评论

3

您的IPV4地址十进制值为9766322441已经超出了有效范围。如果转换成十六进制,它的值是0x2461E4109,占用了5个八位字节而不是4个:

02, 46, 1e, 41, 09

计算器只截取值为0x02的八位字节,并使用4个最低有效八位字节转换值。

0x461E4109的计算结果为“70.30.65.9”,计算器上显示了这个值。


如何在Java中执行此操作:

我建议使用标准的Java类进行InetAddress操纵。这应该适用于IPV4和IPv6: http://docs.oracle.com/javase/1.5.0/docs/api/java/net/InetAddress.html

您可能正在查找类似以下内容的东西(我十年前就使用过Java,如果您发现语法错误,请随时更正)

InetAddress Address = InetAddress.getByName("192.168.0.1");
InetAddress Address = InetAddress.getByName(raw2);
String s1 = Address.toString();
byte[] raw = Adress.getAddress();

byte[] rawIPv4 = {192, 168, 0, 1};
InetAddress Address1 = InetAddress.getByName(rawIPV4);

InetAddress Address2 = InetAddress.getByName("2607:f0d0:1002:51::4");
byte[] rawIPV6 = Adress.getAddress();

IPv6示例还涵盖了地址中的“压缩零”情况(51和4之间的“::”)。
无论如何,您可能需要检查以下内容以将字节数组转换为整数:
Java中的字节数组和Int转换 请注意,IPV6格式确实对于单个IP地址使用16个字节,因此我不确定是否可以像计算器中显示的那样用单个整数值表示它。

谢谢回答,我明白了。那么,将其转换回该数字的步骤是什么,因为我正在设计算法。 - akshay1728

2

IPv4地址是32位的。

数字9,766,322,441无法在32位上表示(最大值:4,294,967,295)。


有没有任何解决方案可以将其转换为这个呢?因为我想开发手机转IP和反之的算法。 - akshay1728
1
@PriyaSakal,你应该检查输入的有效性,9.766.322.441不是一个有效的IP地址。 - Vincenzo Pii
这意味着无法将任何10位数字转换为IP地址,反之亦然。你必须提到这个限制。 - akshay1728
1
@PriyaSakal 当然有限制,你能用2位表示小数7吗?不行!用两个位只能表示0、1、2和3。IPv4地址只有32位,你必须遵守这个规定。 - Vincenzo Pii

1
阅读原帖和后续跟帖回复,我清晰地感觉到你所说的“10位十进制数”实际上是你想将电话号码转换为IP地址。
“因为我想开发将手机号转换为IP地址及其相反操作的算法。”
这是行不通的。这就像询问如何将MAC地址转换为IP地址一样。电话号码和IP地址由两个完全不同的机构分配。没有算法可以将它们关联起来。

0

0

实际上,IP地址可以转换为32位Java整数,只是该数字可能为负数。这并不是问题,因为您可以在不丢失数据的情况下来回转换。现在,如果您真的想使用额外的32位并将其存储在长整型中,以便它在Java中看起来不是负数,那么您可以这样做,但这是浪费的。您可以编写一个函数将其强制转换为长整型并显示为无符号,但将其存储在整型中。


-1
问题是为什么 9766322441 转换成了 70.30.65.9,但是当再次转换回来时,它给出的结果是 1176387849 而不是 9766322441。答案是因为 4294967296 是由 IP 地址 256.256.256.256 表示的最大十进制数。
超过 4294967296 的数字将在返回行程中转换为低于 256.256.256.256 的数字,就像您的汽车里程表一样。9766322441 显然比 4294967296 的两倍还要多,因此在第二次翻转里程表后,它会再次翻转,最终得到 1176387849。这个新数字将在范围内正常地转换为 IP 地址和从 IP 地址转换而来。

IP地址的最大值是255.255.255.255,而不是256.256.256.256。 - Francisco Zarabozo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接