在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python/ python3 ip地址轉(zhuǎn)int算法

python3 ip地址轉(zhuǎn)int算法

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

這個(gè)ip算法想了很久沒(méi)反推出來(lái),各位大神看得出來(lái)嗎?

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
答案已經(jīng)差不多很像了

回答
編輯回答
怣人

這是 IPv4 在網(wǎng)絡(luò)傳輸中的常見(jiàn)格式,你可以通過(guò) wireshark 抓包工具,在 IPv4 的 SourceDestination 字段看到。

IPv4 地址占用 4 個(gè)字節(jié),傳輸時(shí)采用 big-endian 格式。
比如 IP 0x01020304,它在網(wǎng)絡(luò)中的傳輸順序是 01 02 03 04,轉(zhuǎn)換成我們?nèi)粘R?jiàn)到的字符便是 "1.2.3.4"。

你所貼的代碼

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

可以理解成

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

即對(duì)數(shù)組元素依次左移 24、16、8、0 位。

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

import socket
import struct

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

# 數(shù)字 -> 字符串
a2 = socket.inet_ntoa(struct.pack('>I', n))
assert a2 == a
2018年1月2日 17:34
編輯回答
忠妾
61.140.24.198
3D.BA.FC.93    # 每一段轉(zhuǎn)十六進(jìn)制
3DBAFC93    # 拼接
1035664531    # 轉(zhuǎn)十進(jìn)制

錯(cuò)了錯(cuò)了, 并不是正確答案

2018年7月16日 20:31