61.140.24.198,1035664531115.230.17.198,194307419536.6.158.117,607156768117.67.49.165,1970656752这个ip算法想了很久没反推出来,各位大神看得出来吗?def ip2int(ip):ip_list = ip.strip().split('.')SUM = 0for i in range(len(ip_list)): SUM += int(ip_list[i])*256**(3-i)return SUMprint(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.1171944457670 -> 115.230.17.198答案已经差不多很像了
2 回答
波斯汪
TA贡献1811条经验 获得超4个赞
这是 IPv4 在网络传输中的常见格式,你可以通过 wireshark 抓包工具,在 IPv4 的 Source 或 Destination 字段看到。
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 socketimport 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
添加回答
举报
0/150
提交
取消