【问题标题】:IP address conversion to decimal and vice versaIP地址转换为十进制,反之亦然
【发布时间】: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地址,这是不可能的。这是两个完全不相关的不同价值观。

标签: java php networking decimal ip-address


【解决方案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 到手机号码的覆盖率跨度>
【解决方案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。
        猜你喜欢
        • 2012-09-18
        • 2014-09-20
        • 1970-01-01
        • 2021-07-17
        • 2022-01-13
        • 2016-05-22
        • 1970-01-01
        • 2010-09-17
        相关资源
        最近更新 更多