假设我的十进制数为9766322441
因此其对应的是70.30.65.9
,但是当这个IP地址IC转换回,其给出了一些不同的十进制数1176387849
...当我转换IP地址PF google.com即64.233.187.99
那么它给在1089059683
和反向转换,即给出正确的IP地址64.233.187.99
...
我的问题是什么是错的上述提到多少? 我也尝试用9579342332
,但相同的结果。 它给了错误的反向转换?
背后是什么原因?
你可以使用这个计算器进行计算。
IPv4地址是32位。
数9,766,322,441
不能在32位(:最大来表示4,294,967,295
)。
你有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);
}
您超出与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地址,所以我不知道,如果你可以用一个整数值代表它如图所示的计算器。
在读原来的职位,并在回应别人的答案后续跟进的帖子,我得到了鲜明的印象,你的原来的“10位十进制”,实际上是要以某种方式变成一个IP地址的电话号码。
“因为我想开发用于移动的转换算法IP和反之亦然”
它不工作的方式。 这就像问如何采取一个MAC地址,将其转换为IP地址。 电话号码和IP地址是由两个完全不同的部门分配。 没有算法涉及两个。
实际上IP地址可以被转换为32位Java整数它只是数可能为负。 这确实是好的,因为你可以将它转换来回无数据丢失。 现在,如果你真的想用一个额外的32位,并将其存储在一个长只是让不看消极到Java就可以了,但它的浪费。 您可以编写一个函数来将它转换为长,显示它未签名的,但它在存储和INT。
问题是为什么当初9766322441转换为70.30.65.9,但转换回时,它提供1176387849而不是9766322441.答案是因为4294967296是由IP 256.256.256.256代表最高可能十进制数。
以上4294967296它会转换成下面256.256.256.256一些回程就像滚动的里程表上你的车。 9766322441大于4294967296值的两倍更清楚并最终轧制里程表与1176387849里程表上的第三辊两次结束了。 然后,这个新号码将转换为和来自一个IP地址通常,因为它是在范围之内。
也有一些方法可以做到这一点在Excel中。 一些计算是混乱,但最简单的方法是使用一个用户定义函数所看到的这篇文章如何在Excel排序IP地址列表