0%

ip-num-con

IP地址(IPv4)和数字互转

背景概要

IP地址长度: 4字节即32位构成, 分为了4部分

示例: 192.168.0.1

表示方法 第1部分 第2部分 第3部分 第4部分
2进制 11000000 10101000 00000000 00000001
点分10进制 192 168 0 1

IP地址转数字

以192.168.0.1为例, 其2进制表示方法为11000000.10101000.00000000.00000001

转换原理: 其4部分看做一个整体,但是分别转换为10进制,最后相加

拆解如下

第1部分: 11000000 00000000 00000000 00000000 = 3221225472
第2部分: 00000000 10101000 00000000 00000000 = 11010048
第3部分: 00000000 00000000 00000000 00000000 = 0
第4部分: 00000000 00000000 00000000 00000001 = 1

相加: 3221225472 + 11010048 + 0 + 1 = 3232235521

Shell实现:

1
2
root@dev ~ #echo $(($((192<<24))+$((168<<16))+$((0<<8))+1))
3232235521

解读

<< 位移符

$((192<<24)): 第1部分向左移动24位(位移都是转换为2进制)

$((128<<16)): 第2部分向左移动16位
... ...

数字转IP地址

以3232235521为例, 其2进制值为11000000101010000000000000000001

转换原理: 将其2进制值,由低位开始每8位为单位拆分为4部分, 分别转为10进制后, 拼接即可

注意: 高位不足8位时前面以0补齐即可

拆解如下

第4部分: 00000001 = 1
第3部分: 00000000 = 0
第2部分: 10101000 = 168
第1部分: 11000000 = 192

拼接: 192.168.0.1

Shell实现

1
2
root@dev ~ #echo "$((3232235521>>24)).$((3232235521>>16&0xff)).$((3232235521>>8&0xff)).$((3232235521>>0&0xff))"
192.168.0.1

解读

>> 位移符

0xff 0x 16进制, 0xff其转换为2进制值为11111111

第1部分: $((3232235521>>24)) 3232235521转为2进制的值向右移动24位,即只保留了第1部分11000000(=192)

第2部分: $((3232235521>>16&0xff)): 3232235521转为2进制的值向右移动16位, 即保留了第1部分 11000000 和第2部分 10101000

11000000 10101000 和 0xff 做&操作,即

1
2
3
4
5
6
10101000 10101000

00000000 11111111
=
00000000 10101000
=168

可以理解为0xff做了截断操作

第3、4部分同理