在Python中将IPv4地址转换为十六进制IPv6地址
Q:编写一个程序,提示用户输入IP地址,然后将其转换为10进制、二进制和十六进制值。然后程序将十六进制值转换为RFC3056 IPv6 6to4地址 我有基本的10和二进制部分工作,但我似乎不能得到我的头周围的六角部分。format string方法能否以某种方式完成同样的任务?在这种情况下,我是否需要导入ipaddress模块在Python中将IPv4地址转换为十六进制IPv6地址,python,hex,type-conversion,ip-address,ipv6,Python,Hex,Type Conversion,Ip Address,Ipv6,Q:编写一个程序,提示用户输入IP地址,然后将其转换为10进制、二进制和十六进制值。然后程序将十六进制值转换为RFC3056 IPv6 6to4地址 我有基本的10和二进制部分工作,但我似乎不能得到我的头周围的六角部分。format string方法能否以某种方式完成同样的任务?在这种情况下,我是否需要导入ipaddress模块 #!/usr/bin/python3 ip_address = input("Please enter a dot decimal IP Address: ") "
#!/usr/bin/python3
ip_address = input("Please enter a dot decimal IP Address: ")
"""This part converts to base 10"""
ListA = ip_address.split(".")
ListA = list(map(int, ListA))
ListA = ListA[0]*(256**3) + ListA[1]*(256**2) + ListA[2]*(256**1) + ListA[3]
print("The IP Address in base 10 is: " , ListA)
"""This part converts to base 2"""
base2 = [format(int(x), '08b') for x in ip_address.split('.')]
print("The IP Address in base 2 is: ", base2)
"""This part converts to hex"""
hexIP = []
[hexIP.append(hex(int(x))[2:].zfill(2)) for x in ip_address.split('.')]
hexIP = "".join(hexIP)
print("The IP Address in hex is: " , hexIP)
编辑:管理将IP地址转换为十六进制值。现在,如何将这个十六进制值转换为IPv6地址?在Python 3.3中,您可以使用它来操作IPv4、IPv6地址:
>>> ip_address = '123.45.67.89'
>>> numbers = list(map(int, ip_address.split('.')))
>>> '2002:{:02x}{:02x}:{:02x}{:02x}::'.format(*numbers)
'2002:7b2d:4359::'
#!/usr/bin/env python3
import ipaddress
# get ip address
while True:
ip4str = input("Enter IPv4 (e.g., 9.254.253.252):")
try:
ip4 = ipaddress.IPv4Address(ip4str)
except ValueError:
print("invalid ip address. Try, again")
else:
break # got ip address
# convert ip4 to rfc 3056 IPv6 6to4 address
# http://tools.ietf.org/html/rfc3056#section-2
prefix6to4 = int(ipaddress.IPv6Address("2002::"))
ip6 = ipaddress.IPv6Address(prefix6to4 | (int(ip4) << 80))
print(ip6)
assert ip6.sixtofour == ip4
# convert ip4 to a base 10
print(int(ip4))
# convert ip4 to binary (0b)
print(bin(int(ip4)))
# convert ip4 to hex (0x)
print(hex(int(ip4)))
#/usr/bin/env蟒蛇3
导入IP地址
#获取ip地址
尽管如此:
ip4str=输入(“输入IPv4(例如,9.254.253.252):”)
尝试:
ip4=ipaddress.IPv4Address(ip4str)
除值错误外:
打印(“无效的ip地址。请重试”)
其他:
断开#获得ip地址
#将ip4转换为rfc 3056 IPv6 6to4地址
# http://tools.ietf.org/html/rfc3056#section-2
prefix6to4=int(ipaddress.IPv6Address(“2002:”))
ip6=ipaddress.IPv6地址(prefix6to4 |(int(ip4)如果您只想在IPv6上下文中使用IPv4地址(例如,通过传递到使用socket.AF|INET6
地址族创建的socket.connect()
),您可以使用以下语法:
也就是说,只需将::ffff:
前置到IPv4地址,您就会得到一个有效的6to4地址。如果您想将此地址转换为更常见的十六进制格式,我建议使用您提到的标准库ipaddress
模块:
>>> import ipaddress
>>> a = '10.20.30.40'
>>> print(ipaddress.IPv6Address('2002::' + a).compressed)
'2002::a14:1e28'
在参考解决方案之前,请先看一看有关ipv6表示的转换和约定的文档
def ipconversion4to6(ipv4_address):
hex_number = ["{:02x}".format(int(_)) for _ in address.split(".")]
ipv4 = "".join(hex_number)
ipv6 = "2002:"+ipv4[:4]+":"+ipv4[4:]+"::"
return ipv6
太好了!非常感谢:)必须以'2002::/16'
开始,即在您的示例中。将其更改为:'2002:0:0:0:ffff:{:02x}{:02x}:{:02x}。格式(*数字)不考虑子网,但现在可以。@user1819786:0:0:0:0:ffff:
在这种情况下也不正确。请单击我以前评论中的两个链接。
def ipconversion4to6(ipv4_address):
hex_number = ["{:02x}".format(int(_)) for _ in address.split(".")]
ipv4 = "".join(hex_number)
ipv6 = "2002:"+ipv4[:4]+":"+ipv4[4:]+"::"
return ipv6