Python IPv6字节转地址

3

我正在iOS应用程序Pythonista 3上运行Python。当我尝试获取IPv6地址时,它返回的是字节而不是格式化的地址。现在我正在尝试找到一种方法来正确地获取地址而不使用字节,或者找到一种方法使字节变为地址。以下是我用来获取地址的代码:

def getIPv6Addr(input):
    return socket.getaddrinfo(input, None, socket.AF_INET6)

这是输出的结果:

[(30, 2, 17, '', (30, '\x00\x00\x00\x00\x00\x00&\x07\xf8\xb0@\x00\x08\x14')), (30, 1, 6, '', (30, '\x00\x00\x00\x00\x00\x00&\x07\xf8\xb0@\x00\x08\x14'))]

编辑:另一种解决方案是找出将这些数据转换为字节的编码类型。
What Makes:
2607:f8b0:4000:814::200e
become
\x00\x00\x00\x00\x00\x00&\x07\xf8\xb0@\x00\x08\x14

可能相关?https://dev59.com/wEjSa4cB1Zd3GeqPIMW9 你得到的这个二元组看起来肯定不像指定IPv6地址的任何东西。 - chepner
我在Linux上使用Python2或Python3的socket.getaddrinfo函数,却发现两者的结果并不相似。这让我非常惊讶。 - Sam Hartman
3个回答

1
你可以使用Python中包含的ipaddress模块。只需将字节传递给ipaddress.IPv6Address构造函数,你就会得到一个代表地址并提供许多打印和操作选项的对象。

0

如果你使用这个包,有一个快速的方法:

from django.utils.encoding import smart_str

a = '\x00\x00\x00\x00\x00\x00&\x07\xf8\xb0@\x00\x08\x14'


print(smart_str(a))

在尝试运行smart_str时,我发现Pythonista + Django不起作用,因为Django调用子进程,而iOS会阻止子进程。感谢您的尝试! - RoNAPC

0

问题已解决!

我使用十六进制编码字节,这使它变成了地址!

>>> getIPv6Addr("google.com")[0][4][1].encode("hex")
'0000000000002607f8b040000811'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接