在Python中使用inet_ntoa函数

在Python中使用inet_ntoa函数,python,Python,我最近开始用python编程,在理解inet\u nota和inet\u aton如何在python中工作时遇到了一些问题。来自php/mysql,我总是将ip地址作为长变量存储在数据库中。此外,mysql中的inet\u ntoa方法接收一个长变量作为参数,并返回IP的点格式,因此我假设Python版本的工作方式类似。然而,Python的inet\u ntoa似乎需要32位压缩二进制格式。因此,将IP地址存储为167772160值,如何将其转换为inet\u ntoa方法所需的32位压缩二进制

我最近开始用python编程,在理解
inet\u nota
inet\u aton
如何在python中工作时遇到了一些问题。来自php/mysql,我总是将ip地址作为长变量存储在数据库中。此外,mysql中的
inet\u ntoa
方法接收一个长变量作为参数,并返回IP的点格式,因此我假设Python版本的工作方式类似。然而,Python的inet\u ntoa似乎需要32位压缩二进制格式。因此,将IP地址存储为
167772160
值,如何将其转换为
inet\u ntoa
方法所需的32位压缩二进制值(如
\x7f\x00\x00\x01

非常感谢使用Python 3.3+(或用于2.6和2.7的),您只需使用:

或者,您可以手动打包该值

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

您可能还对以下内容感兴趣。

作为此线程的后期补充:如果您使用的是Python 3.3或更高版本,请查看模块:它比
套接字
等价物更具功能。

我在我的项目中使用pyjamas,我得到:“raise StructError”,I,l,l,q,q,h,h的参数必须是整数“。我试过几种组合,但似乎都不起作用。有什么解决办法吗?@tibi3384这可能是因为你有一个数字串。用
int
把它包装起来,像这样:
struct.pack('!I',int(string\u ip\u number\u variable))
。该死,你说得对,应该发现了!工作完美。我想我仍然习惯于php,在这里,强制转换将自动执行:)。Cheerre我非常不喜欢python,因为类似的事情。@jrwren使用当前的解决方案进行了更新。我怀疑有哪种语言能提供比这更简单的解决问题的方法。请注意,
ntoa
是一个套接字函数,与Python无关。
import socket,struct
packed_value = struct.pack('!I', 167772160)
addr = socket.inet_ntoa(packed_value)
assert addr == '10.0.0.0'
from struct import pack

n = pack("!I", 167772160)