0.摘要
本文主要介绍32位二进制ip地址和十进制数字地址相互转换方式,并用python3实现。
1.ip地址与数字地址转换关系
我们知道ip地址实际上是32位二进制数,例如:
点分十进IP地址100.4.5.6 <---->32位二进制数01100100.00000100.00000101.00000110
若将32位二进制数转换为十进制,就得到了数字地址。
简单来说,就是先将IP地址四个整数值转为二进制,四个二进制数值拼接之后,再由二进制转为十进制。
2.转换方式
通过观察可以发现:
十进制 |
二进制 |
100 |
01100100 |
4 |
00000100 |
5 |
00000101 |
6 |
00000110 |
根据二进制运算规则,可知:
2^24 * (01100100)= | 01100100 00000000 00000000 00000000 |
2^16 * (00000100)= | 00000000 00000100 00000000 00000000 |
2^8 * (00000101)= | 00000000 00000000 00000101 00000000 |
2^0 * (00000110)= | 00000000 00000000 00000000 00000110 |
那么,将ip地址的四个二进制数拼接起来,可以通过这样的方式:
01100100 00000100 00000101 00000110 = 2^24 * (01100100) + 2^16 * (00000100) + 2^8 * (00000101) + 2^0 * (00000110)
结论:将点分十进IP的ip地址转化成十进制数字地址,只要将对应数字分别乘以2^24,2^16,2^8 ,2^0,最后相加即可。
下面的两个表格给出了点分十进IP与数字地址的转换关系:
IP | 数字地址 |
A.B.C.D | 2^24 * A + 2^16 * B + 2^8 * C + 2^0 * D |
IP | 数字地址 |
A | (VALUE // (2 ** 24) ) % (2 ** 32) |
B | (VALUE // (2 ** 16) ) % (2 ** 24) |
C | (VALUE // (2 ** 8) ) % (2 ** 16) |
D | (VALUE // (2 ** 0) ) % (2 ** 8) |
def ip2decimalism(ip):
dec_value = 0
v_list = ip.split('.')
v_list.reverse()
t = 1
for v in v_list:
dec_value += int(v) * t
t = t * (2 ** 8)
return dec_value
def decimalism2ip(dec_value):
ip = ''
t = 2 ** 8
for _ in range(4):
v = dec_value % t
ip = '.' + str(v) + ip
dec_value = dec_value // t
ip = ip[1:]
return ip
if __name__ == '__main__':
while(1):
ip = input()
dec_value = ip2decimalism(ip)
print(dec_value)
ip = decimalism2ip(dec_value)
print(ip)
可见程序成功实现了点分十进制ip地址转为十进制数字地址的相互转换。
这里留一个在线转换器,帮助大家验证自己的代码: