3

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

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

背后的原因是什么??

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

4

7 回答 7

19

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

32 位的限制 - Java:如何将 dec 转换为 32 位 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 示例: - String ip="70.30.65.9"; String[] addrArray = ip.split("\."); 长数 = 0; for (int i = 0; i PHP 函数将 IP 转换为十进制: - 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");
PHP 中将 IP 转换为十进制的另一个示例: - function myip2long2 ($ip){ $d = 0.0; $b = explode(".", $ip,4); for ($i = 0; $i PHP 示例将十进制转换为 IP: - function customLong2ip($ip){ $b=数组(0,0,0,0);$c = 16777216.0;$ip += 0。 0; 对于 ($i = 0; $i
于 2012-08-26T13:29:33.090 回答
3

您超出了有效的 IPV4 范围,十进制值为 9766322441。如果转换为十六进制,它将为您提供占用 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 格式确实对单个 IP 地址使用 16 个字节,因此我不确定您是否可以使用单个整数值来表示它,如计算器所示。

于 2012-08-26T13:42:45.150 回答
2

IPv4 地址是 32 位的。

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

于 2012-08-26T13:46:51.107 回答
1

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

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

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

于 2014-11-10T20:18:16.940 回答
0

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

于 2013-06-13T15:41:40.087 回答
0

在 Excel 中也有一些方法可以做到这一点。一些计算很混乱,但最简单的计算是使用用户定义函数,如这篇文章如何在 Excel 中对 IP 地址列表进行排序

于 2013-12-02T12:25:56.960 回答
-1

问题是为什么 9766322441 会转换为 70.30.65.9,但是当转换回来时,它会给出 1176387849 而不是 9766322441。答案是因为 4294967296 是由 IP 256.256.256.256 表示的最高十进制数。

高于 4294967296 它将在回程中转换为低于 256.256.256.256 的数字,就像在汽车上滚动里程表一样。9766322441 显然是 4294967296 值的两倍多,并最终滚动里程表两次,最后在里程表的第三次滚动中以 1176387849 结束。然后,这个新号码将正常地与 IP 地址相互转换,因为它在范围内。

于 2013-10-05T00:51:42.990 回答