python3 ip地址转int算法

61.140.24.198,1035664531
115.230.17.198,1943074195
36.6.158.117,607156768
117.67.49.165,1970656752

这个ip算法想了很久没反推出来,各位大神看得出来吗?

def ip2int(ip):

ip_list = ip.strip().split('.')
SUM = 0
for i in range(len(ip_list)):
    SUM += int(ip_list[i])*256**(3-i)
return SUM    

print(str(ip2int("36.6.158.117"))+str(" -> 36.6.158.117"))

print(str(ip2int("115.230.17.198"))+str(" -> 115.230.17.198"))
604413557 -> 36.6.158.117
1944457670 -> 115.230.17.198
答案已经差不多很像了

阅读 3.6k
2 个回答
61.140.24.198
3D.BA.FC.93    # 每一段转十六进制
3DBAFC93    # 拼接
1035664531    # 转十进制

错了错了, 并不是正确答案

这是 IPv4 在网络传输中的常见格式,你可以通过 wireshark 抓包工具,在 IPv4 的 SourceDestination 字段看到。

IPv4 地址占用 4 个字节,传输时采用 big-endian 格式。
比如 IP 0x01020304,它在网络中的传输顺序是 01 02 03 04,转换成我们日常见到的字符便是 "1.2.3.4"。

你所贴的代码

SUM += int(ip_list[i])*256**(3-i)

可以理解成

SUM |= int(ip_list[i]) << (8*(3-i))

即对数组元素依次左移 24、16、8、0 位。

除此之外,还有更便捷的方法,如

import socket
import struct

# 字符串 -> 数字
a = '1.2.3.4'
n = struct.unpack('>I', socket.inet_aton(a))[0]
assert n == 0x01020304

# 数字 -> 字符串
a2 = socket.inet_ntoa(struct.pack('>I', n))
assert a2 == a
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题