2011-03-07 48 views
5

我最近開始用python編程,我在理解inet_notainet_aton如何在Python中工作時遇到一些麻煩。來自php/mysql我總是將IP地址作爲長變量存儲在數據庫中。另外mysql中的inet_ntoa方法接收一個長變量作爲參數,並返回一個IP的點狀格式,所以我假設P​​ython版本以類似的方式工作。但是,Python的inet_ntoa似乎需要32位打包二進制格式。所以,如果將IP地址存儲爲167772160的值,那麼我怎樣才能將其轉換爲32位打包二進制值(如\x7f\x00\x00\x01),這是inet_ntoa方法所需要的?在Python中使用inet_ntoa函數

非常感謝

回答

13

在Python 3.3+(或this backport爲2.6和2.7),你可以簡單地使用ipaddress

import ipaddress 
addr = str(ipaddress.ip_address(167772160)) 
assert addr == '10.0.0.0' 

或者,您也可以手動打包值

import socket,struct 
packed_value = struct.pack('!I', 167772160) 
addr = socket.inet_ntoa(packed_value) 
assert addr == '10.0.0.0' 

您可能也有興趣inet_pton

+0

我爲我的項目使用睡衣,我得到:「raise StructError」,對於我,I,L,Q,Q,H,H的參數必須是整數「。我嘗試了幾種組合但似乎沒有任何工作,是否有任何解決方法呢? – tibi3384 2011-03-08 13:53:31

+0

@ tibi3384這可能是因爲你有一個數字的字符串,將它包裝在'int'中,就像這樣:'struct.pack('!I',int(string_ip_number_variable )''。 – phihag 2011-03-08 14:08:29

+0

該死的,你說得對,應該已經發現了!完美的工作。猜猜我仍然習慣於自動執行演員表的PHP。)乾杯 – tibi3384 2011-03-08 14:22:01

2
from struct import pack 

n = pack("!I", 167772160) 
0

由於後期除了這個線程:如果你正在使用Python 3.3或以上,看ipaddress模塊:它比socket當量更加實用。