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地址转换为十进制,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章