为了账号安全,请及时绑定邮箱和手机立即绑定

python3 ip地址转int算法

python3 ip地址转int算法

ibeautiful 2019-03-05 15:09:49
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


查看完整回答
反对 回复 2019-03-09
  • 2 回答
  • 0 关注
  • 953 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信