python IP地址轉(zhuǎn)整數(shù)
背景
今天有人問我 “為什么數(shù)據(jù)庫中有人推薦使用 int 類型來保存 IP 地址?”?,F(xiàn)在(2020年)來看這個(gè)東西已經(jīng)有點(diǎn)過時(shí)了,一方面是磁盤空間不在那么貴,另一方面是 IPv6 與這條法則不兼容。
下面我們就來看一下把 IPv4 地址轉(zhuǎn)換成整數(shù)的原理和收益各是什么。
轉(zhuǎn)換的原理
一個(gè) IPv4 類的地址共分為四個(gè)部分 0.0.0.0 然而每一個(gè)部分的取值范圍都在 0 ~ 255;也就是說每一個(gè)部分都可以用一個(gè)字節(jié)來保存,總共寫個(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 來保存 IPv4 地址,這樣的話需要 15 (3*4 + 3) 個(gè)字節(jié)才行;如果轉(zhuǎn)換一下只需要 4 個(gè)字節(jié)就行了,節(jié)約了磁盤空間,可能會(huì)多用點(diǎn) cpu 時(shí)間。
今天來說 IPv6 已經(jīng)是主流,它的長度直接從之前的 4 字節(jié)直接漲到了 16 字節(jié);int 不再能滿足需求,為了可以統(tǒng)一處理這兩種類型的 IP 現(xiàn)在推薦使用 varchar 來保存。
inet_aton 與 inet_ntoa
這一對(duì) IP 是 IPv4 時(shí)代的轉(zhuǎn)換函數(shù),目前來看已經(jīng)過時(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 IP 地址轉(zhuǎn)整數(shù)的詳細(xì)內(nèi)容,更多關(guān)于python ip地址轉(zhuǎn)整數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 用python查找統(tǒng)一局域網(wǎng)下ip對(duì)應(yīng)的mac地址
- Python3獲取電腦IP、主機(jī)名、Mac地址的方法示例
- python獲取本機(jī)mac地址和ip地址的方法
- python生成隨機(jī)mac地址的方法
- Python生成隨機(jī)MAC地址
- python通過scapy獲取局域網(wǎng)所有主機(jī)mac地址示例
- python3判斷IP地址的方法
- python 輸入字符串生成所有有效的IP地址(LeetCode 93號(hào)題)
- 基于python實(shí)現(xiàn)查詢ip地址來源
- python如何判斷IP地址合法性
- Python中IP地址處理IPy模塊的方法
- 如何用Python獲取計(jì)算機(jī)名,ip地址,mac地址
相關(guān)文章
Python的matplotlib繪圖如何修改背景顏色的實(shí)現(xiàn)
這篇文章主要介紹了Python的matplotlib繪圖如何修改背景顏色的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python3+Appium實(shí)現(xiàn)多臺(tái)移動(dòng)設(shè)備操作的方法
這篇文章主要介紹了Python3+Appium實(shí)現(xiàn)多臺(tái)移動(dòng)設(shè)備操作的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python使用pynput庫操作、監(jiān)控你的鼠標(biāo)和鍵盤
這篇文章主要介紹了python使用pynput庫操作、監(jiān)控你的鼠標(biāo)和鍵盤,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03Python利用PyPDF2庫獲取PDF文件總頁碼實(shí)例
這篇文章主要介紹了Python利用PyPDF2庫獲取PDF文件總頁碼實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04大語言模型的開發(fā)利器langchainan安裝使用快速入門學(xué)習(xí)
這篇文章主要為大家介紹了大語言模型的開發(fā)利器langchain安裝使用快速入門學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Python實(shí)戰(zhàn)基礎(chǔ)之繪制餅狀圖分析商品庫存
餅狀圖(pie chart)一般用于描述分類型數(shù)據(jù)的相對(duì)頻數(shù)或百分?jǐn)?shù)頻數(shù)分布,呈現(xiàn)部分與總體的關(guān)系,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)戰(zhàn)基礎(chǔ)之繪制餅狀圖分析商品庫存的相關(guān)資料,需要的朋友可以參考下2022-07-07python實(shí)現(xiàn)讀取并顯示圖片的兩種方法
本篇文章主要介紹python實(shí)現(xiàn)讀取并顯示圖片的兩種方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01