我试图执行以下操作:
firstoctet * 256 + secondoctet = * 256 + thirdoctet = * 256 + fourthoctet = x
当我以此为例时:
64.233.187.99 (google.com)
64 * 256 + 233 = * 256 + 187 = * 256 + 99 = http://1089059683/
有人可以提供一个方法来说明如何做到这一点?数学序列没有问题,我只是不确定如何从小数点中取出八位字节值来执行数学函数。
提前致谢!
答案 0 :(得分:1)
如果您使用的是Python 3.3或更高版本,则可以利用the ipaddress
module来避免重新发明轮子,它甚至可以bytes
提供有用的视图int.from_bytes
转换为真实int
:
from ipaddress import IPv4Address
ip_as_addr = IPv4Address("64.233.187.99")
ip_as_int = int.from_bytes(ip_as_addr.packed, 'big')
print(ip_as_int, hex(ip_as_int))
获取1089059683 0x40e9bb63
的输出。
如果您真的想要,可以手动完成,我只是喜欢上述代码的自我记录方面。如果Py 3.3+不是一个选项,你可以得到相同的结果:
octets = map(int, "64.233.187.99".split('.'))
ip_as_int = sum(octet << ((3 - i) * 8) for i, octet in enumerate(octets))
只是将八位字节分开,将它们转换为int
,然后将它们中的每一个向左移动24,16,8和0位(以正确对齐八位字节),然后允许sum
将它们合并为一个int
。
答案 1 :(得分:0)
将IP地址字符串转换为如下所示的整数列表:
ip_as_string = "64.233.187.99"
ip_as_ints = [int(a) for a in ip_as_string.split('.')]
ip_as_ints
将是[64,233,187,99]。
我猜你打算执行的数学表达式是RPN,用于将字节序列从base-256表示转换为单个数字。 (感谢ShadowRanger展示了这一点)。您可以轻松获得该单个数字:
x = functools.reduce(lambda x,y: (x << 8) | y, ip_as_ints, 0)
print(x)
x是1089059683。