2011-03-07 120 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当量更加实用。