IP地址转换为十进制,反之亦然(IP address conversion to decimal a

2019-07-31 04:25发布

假设我的十进制数为9766322441因此其对应的是70.30.65.9 ,但是当这个IP地址IC转换回,其给出了一些不同的十进制数1176387849 ...当我转换IP地址PF google.com即64.233.187.99那么它给在1089059683和反向转换,即给出正确的IP地址64.233.187.99 ...

我的问题是什么是错的上述提到多少? 我也尝试用9579342332 ,但相同的结果。 它给了错误的反向转换?

背后是什么原因?

你可以使用这个计算器进行计算。

Answer 1:

IPv4地址是32位。

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



Answer 2:

你有70.30.65.9将与1176387849对应,但从来没有与9766322441不正确的值。

32位限制- 的Java:如何十二月转换为32bit的诠释?

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';
   }


这是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();
  }
}


另一个Java为例,IP转换为十进制:

String ip="70.30.65.9"; 
String[] addrArray = ip.split("\."); 
long num = 0; 
   for (int i = 0; i < addrArray.length; i++) { 
     int power = 3 - i; 
     num += ((Integer.parseInt(addrArray[i]) % 256 * Math.pow(256, power))); 
   }


PHP函数转换IP到decimical:

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到decimical:

function myip2long2($ip){
    $d = 0.0;
    $b = explode(".", $ip,4);
      for ($i = 0; $i < 4; $i++) {
         $d *= 256.0;
         $d += $b[$i];
       };
  return $d;
}

这一次将为您提供相同的结果,如上图所示:

PHP例子十进制转换为IP:

function customLong2ip($ip){
  $b=array(0,0,0,0);
  $c = 16777216.0;
  $ip += 0.0;
     for ($i = 0; $i < 4; $i++) {
       $k = (int) ($ip / $c);
       $ip -= $c * $k;
       $b[$i]= $k;
       $c /=256.0;
      };
    $d=join('.', $b);
  return($d);
}




Answer 3:

您超出与9766322441.十进制值有效的IPV4范围内。如果转换为十六进制,它给你的价值0x2461E4109占据5个字节,而不是4:

02, 46, 1e, 41, 09

计算器简单地截断与0×02的值的八位位组,并使用至少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的例子还包括在地址“压缩0”的情况下(在“::” 51和4之间)。

无论如何,你可能要检查这个为字节数组转换为整数:
字节数组和Int转换在Java中

但请注意的是,IPv6格式的确使用了16个字节的一个IP地址,所以我不知道,如果你可以用一个整数值代表它如图所示的计算器。



Answer 4:

在读原来的职位,并在回应别人的答案后续跟进的帖子,我得到了鲜明的印象,你的原来的“10位十进制”,实际上是要以某种方式变成一个IP地址的电话号码。

“因为我想开发用于移动的转换算法IP和反之亦然”

它不工作的方式。 这就像问如何采取一个MAC地址,将其转换为IP地址。 电话号码和IP地址是由两个完全不同的部门分配。 没有算法涉及两个。



Answer 5:

实际上IP地址可以被转换为32位Java整数它只是数可能为负。 这确实是好的,因为你可以将它转换来回无数据丢失。 现在,如果你真的想用一个额外的32位,并将其存储在一个长只是让不看消极到Java就可以了,但它的浪费。 您可以编写一个函数来将它转换为长,显示它未签名的,但它在存储和INT。



Answer 6:

问题是为什么当初9766322441转换为70.30.65.9,但转换回时,它提供1176387849而不是9766322441.答案是因为4294967296是由IP 256.256.256.256代表最高可能十进制数。

以上4294967296它会转换成下面256.256.256.256一些回程就像滚动的里程表上你的车。 9766322441大于4294967296值的两倍更清楚并最终轧制里程表与1176387849里程表上的第三辊两次结束了。 然后,这个新号码将转换为和来自一个IP地址通常,因为它是在范围之内。



Answer 7:

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



文章来源: IP address conversion to decimal and vice versa