1

我有一个用于存储 IP 地址的字段,我正在使用此代码将 IPv4 地址转换为整数,因此我可以将地址的可排序版本保存在单独的 bigint 字段中以实现更自然的排序(基于):

octets = ip.split('.')
return (int(octets[0]) * 256**3) + (int(octets[1]) * 256**2) + (int(octets[2]) * 256) + (int(octets[3]))

如何使用对于 bigint 字段来说太大的 IPv6 地址做类似的事情?

有没有一种简单的方法来为 IPv6 进行整数转换?Python3 似乎为它提供了“ipaddress”模块,但我使用的是 2.7。我想支持在地址中留下零的各种方法。

更新:我正在使用 Django 1.5

4

2 回答 2

1

我最终使用此代码将 IP 转换为整数:

import struct, socket

try:
    return struct.unpack('!I', socket.inet_pton(socket.AF_INET, ip))[0]
except socket.error:
    try:
        hi, lo = struct.unpack('!QQ', socket.inet_pton(socket.AF_INET6, ip))
        return (hi << 64) | lo
    except socket.error:
        return 0

根据 kroolik 的建议,使用 DecimalField 有效

于 2013-11-13T22:00:28.043 回答
-1

我相信我会在 . 上拆分 IPv4 地址,然后按列表排序。同样对于 IPv6,我会尝试拆分 :,并将它们也排序为列表。

并将其包装为一个类可能是一个好主意,以防有一天行为需要改变。这样,如果它确实发生了变化,这些变化不会分散在您的代码中。

于 2013-11-13T21:48:26.657 回答