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 | root@dev ~ #echo $(($((192<<24))+$((168<<16))+$((0<<8))+1)) |
解读
<<
位移符
$((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 | root@dev ~ #echo "$((3232235521>>24)).$((3232235521>>16&0xff)).$((3232235521>>8&0xff)).$((3232235521>>0&0xff))" |
解读
>>
位移符
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 | 10101000 10101000 |
可以理解为0xff做了截断
操作
第3、4部分同理