IP地址的不同格式和转化

摘要:

Internet的发展离不开IP(Internet Protocol,网络之间互联的协议),目前广泛应用的是IPv4,正在积极部署的是IPv6。

本文主要介绍IP地址的不同表达格式和转化。

IP的目的

网络之间互连的协议是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。

IP地址

IPv4使用32位(4字节)地址,因此地址空间中只有4,294,967,296(232)个地址。不过,一些地址是为特殊用途所保留的,如专用网络(约18百万个地址)和多播地址(约270百万个地址),这减少了可在互联网上路由的地址数量。随着地址不断被分配给最终用户,IPv4地址枯竭问题也在随之产生。

为便于使用,IP地址常以XXX.XXX.XXX.XXX形式表现,每组XXX代表小于或等于255的10进制数。

以下均是192.0.2.235,以此为例,有以下不同的格式。

格式 从点分十进制转换
点分十进制 192.0.2.235 ……
点分十六进制 0xC0.0x00.0x02.0xEB 每个字节被单独转换为十六进制
点分八进制 0300.0000.0002.0353 每个字节被单独转换为八进制
十六进制 0xC00002EB 将点分十六进制连在一起
十进制 3221226219 用十进制写出的32位整数
八进制 030000001353 用八进制写出的32位整数

此外,在点分格式中,每个字节都可用任意的进制表达。如,192.0x00.0002.235是一种合法(但很不常用)的表示。

以上IP值尽可以通过执行ping命令,并显示出点分十进制的值。
十进制到点分十进制

IP地址相互转换

一般我们见到的都是点分十进制,那从点分十进制到十进制怎样转换呢?

同样以192.0.2.235 -> 3221226219为例:

3221226219 = 192 * 256^3 + 0 * 256^2 + 2 * 256^1 + 235*256^0

贴几行转换代码,不贴代码不舒服😂😂😂

java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 输入IP“192.0.2.235”, 返回对应的数字形式IP: 3221226219
* 3221226219 = 192 * 256^3 + 0 * 256^2 + 2 * 256^1 + 235*256^0
*/
private static Long calculateIpSum(String strIp) {
validateIp(strIp); // 检验输入IP合法性,不合法抛出错误异常
String[] ss = strIp.split("\\.");
long[] longs = new long[ss.length];
for (int i = 0; i < longs.length; i++) {
longs[i] = Long.valueOf(ss[i]);
}
long result = longs[0] << 24;
result += longs[1] << 16;
result += longs[2] << 8;
result += longs[3];
return result;
}

还有更方便的shell版本:

1
cip(){ echo $1|awk -F. '{n=0;for(i=1;i<=NF;i++){n*=256;n+=$i}print n}'; }

粘贴一下,就可以使用了~

shell版本转换执行效果

其他类似,不一一赘述。

参考

  1. IPv4-维基百科
  2. IPv6_百科