IP地址转换为十进制,反之亦然

Posted

技术标签:

【中文标题】IP地址转换为十进制,反之亦然【英文标题】:IP address conversion to decimal and vice versa 【发布时间】:2012-08-21 06:16:14 【问题描述】:

假设我的十进制数是9766322441,所以它对应的是70.30.65.9,但是当这个IP地址IC转换回来时,它给出了一些不同的十进制数1176387849...当我转换IP地址pf google.com即64.233.187.99,然后它给出1089059683,反向转换给出正确的IP地址,即64.233.187.99 ...

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

这背后的原因是什么??

您可以使用this calculator 进行计算。

【问题讨论】:

根据一些答案的cmets,OP正在尝试将电话号码转换为IP地址,这是不可能的。这是两个完全不相关的不同价值观。 【参考方案1】:

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

32 位限制 - Java: how to convert dec to 32bit int?

IP转十进制的C++例子:

#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';
   
这是将 IP 转换为十进制的 JAVA 类: -
/**
 * @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 示例: - 字符串 ip="70.30.65.9"; String[] addrArray = ip.split("\."); 长数 = 0; 对于 (int i = 0; 我 将IP转换为十进制的PHP函数: - 功能 myip2long($ip) if (is_numeric($ip)) 返回 sprintf("%u", floatval($ip)); 别的 返回 sprintf("%u", floatval(ip2long($ip))); 尝试应用它,例如: 回声 myip2long("192.168.1.1"); PHP 中将 IP 转换为十进制的另一个示例: - 函数 myip2long2($ip) $d = 0.0; $b = explode(".", $ip,4); 对于 ($i = 0; $i 将十进制转换为 IP 的 PHP 示例: - 函数 customLong2ip($ip) $b=数组(0,0,0,0); $c = 16777216.0; $ip += 0.0; 对于 ($i = 0; $i

【讨论】:

从十进制到ip??为什么我提到的上述数字没有给出相同的转换 先生,我想要c,java中的通用解决方案 哦,很抱歉,没注意到这个,我还以为是PHP! 但是先生有 32 位的限制...9766322441 不能像其他人所说的那样在 ip 地址中表示...我想要手机号码到 ip 和 ip 到手机号码的覆盖率跨度> 请阅读:***.com/questions/4984130/…【参考方案2】:

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

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

您可能正在寻找类似的东西(我在 10 多年前使用 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 之间的“::”)的情况。

无论如何,您可能需要检查此以将字节数组转换为整数:Byte Array and Int conversion in Java

但是请注意,IPV6 格式确实使用 16 个字节来表示单个 IP 地址,所以我不确定您是否可以用计算器中所示的单个整数值来表示它。

【讨论】:

thanx for anwering 我明白了..那么将其转换回该数字的步骤是什么,因为我正在为其设计算法【参考方案3】:

IPv4 地址是 32 位的。

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

【讨论】:

确定任何解决方案来转换它...因为我想开发将移动设备转换为 ip 的算法,反之亦然.. @PriyaSakal 您应该检查输入的有效性,9.766.322.441 不是有效的 IP 地址。 这意味着没有解决方案可以将任何 10 位数字转换为 ip,反之亦然..您提到的限制 @PriyaSakal 当然有一个限制,你能用 2 位表示十进制数 7 吗?不!使用两位可以表示 0、1、2 和 3。对于 IPv4 地址,您只有 32 位,您必须遵守这一点。【参考方案4】:

在阅读原始帖子以及随后响应人们回答的后续帖子时,我有一个明显的印象,即您原来的“10 位小数”实际上是您想以某种方式变成 IP 地址的电话号码。

“因为我想开发将移动设备转换为 ip 的算法,反之亦然”

这样不行。这就像询问如何获取 MAC 地址并将其转换为 IP 地址。电话号码和 IP 地址由两个完全不同的机构分配。没有算法可以将两者联系起来。

【讨论】:

【参考方案5】:

实际上,IP 地址可以转换为 32 位 Java 整数,只是该数字可能为负数。这真的很好,因为您可以在不丢失数据的情况下来回转换它。现在,如果您真的想使用额外的 32 位并将其存储在一个 long 中,那么它对 java 来说不会是负面的,您可以这样做,但这很浪费。您可以编写一个函数将其转换为 long 并显示为 unsigned 但将其存储在 int 中。

【讨论】:

【参考方案6】:

在 Excel 中也有一些方法可以做到这一点。一些计算很混乱,但最简单的计算是使用用户定义函数,如本文How to Sort IP Address Lists in Excel中所见@

【讨论】:

【参考方案7】:

问题是为什么 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。

以上是关于IP地址转换为十进制,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串转换为 IP 地址,反之亦然

ip地址与整数转换

Python将IP转换为八进制地址

EXCEL中如何把IP地址批量转换成十进制数字,如下图

将十六进制字符串转换为 IP 地址

在Python中将IP地址字符串转换为二进制