您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)在python項(xiàng)目中如何將 IP地址的格式轉(zhuǎn)為整數(shù),小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
轉(zhuǎn)換的原理
一個(gè) IPv4 類的地址共分為四個(gè)部分 0.0.0.0 然而每一個(gè)部分的取值范圍都在 0 ~ 255;也就是說(shuō)每一個(gè)部分都可以用一個(gè)字節(jié)來(lái)保存,總共寫(xiě)個(gè)字節(jié)就夠了,4 個(gè)字節(jié)不就是 int 嗎?
第一步 把 IP 地址的各個(gè)部分轉(zhuǎn)換為一個(gè)字節(jié),并拼接它們,那么會(huì)得到一個(gè) 4 字節(jié)的串。
import struct def aton(ip_address: str) -> bytes: result = [] for i in ip_address.split('.'): result.append(struct.pack("!B", int(i))) return b''.join(result)
第二步 把字節(jié)串轉(zhuǎn)換成整數(shù)。
In [2]: aton("127.0.0.1") Out[2]: b'\x7f\x00\x00\x01' In [3]: int.from_bytes(b'\x7f\x00\x00\x01','big') Out[3]: 2130706433
這樣我們就把 IPv4 地址轉(zhuǎn)換成了一個(gè)整數(shù),完整的代碼如下。
import struct def aton(ip_address: str) -> bytes: result = [] for i in ip_address.split('.'): result.append(struct.pack("!B", int(i))) return b''.join(result) if __name__ == "__main__": bts = aton("127.0.0.1") print(int.from_bytes(bts, 'big'))
運(yùn)行效果如下。
python3 main.py 2130706433
轉(zhuǎn)換的收益與限制
如果不做轉(zhuǎn)換可以使用 varchar 來(lái)保存 IPv4 地址,這樣的話需要 15 (3*4 + 3) 個(gè)字節(jié)才行;如果轉(zhuǎn)換一下只需要 4 個(gè)字節(jié)就行了,節(jié)約了磁盤(pán)空間,可能會(huì)多用點(diǎn) cpu 時(shí)間。
今天來(lái)說(shuō) IPv6 已經(jīng)是主流,它的長(zhǎng)度直接從之前的 4 字節(jié)直接漲到了 16 字節(jié);int 不再能滿足需求,為了可以統(tǒng)一處理這兩種類型的 IP 現(xiàn)在推薦使用 varchar 來(lái)保存。
inet_aton 與 inet_ntoa
這一對(duì) IP 是 IPv4 時(shí)代的轉(zhuǎn)換函數(shù),目前來(lái)看已經(jīng)過(guò)時(shí)。
1、inet_aton IP 轉(zhuǎn)數(shù)字。
In [4]: socket.inet_aton("127.0.0.1") Out[4]: b'\x7f\x00\x00\x01'
2、inet_ntoa 數(shù)字轉(zhuǎn) IP。
In [5]: socket.inet_ntoa(b'\x7f\x00\x00\x01') Out[5]: '127.0.0.1'
inet_pton 與 inet_ntop
這是一對(duì)新的 API ,這對(duì) API 兼容了 IPv4 和 IPv6 。
In [6]: socket.inet_pton(socket.AF_INET6,"5aef:2b::8") Out[6]: b'Z\xef\x00+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08' In [7]: socket.inet_ntop(socket.AF_INET6,b'Z\xef\x00+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08') Out[7]: '5aef:2b::8' In [8]: socket.inet_pton(socket.AF_INET,"127.0.0.1") Out[8]: b'\x7f\x00\x00\x01' In [9]: socket.inet_ntop(socket.AF_INET,b'\x7f\x00\x00\x01') Out[9]: '127.0.0.1'
以上就是在python項(xiàng)目中如何將 IP地址的格式轉(zhuǎn)為整數(shù),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。