def unpack_ip_address_bytes(data_bytes, addr_type):
'''
Return a tuple containing the unpacked addr_type IP address string, and the
remainder of data_bytes.
addr_type must be either IPV4_ADDRESS_TYPE or IPV6_ADDRESS_TYPE.
data_bytes must be at least IPV4_ADDRESS_LEN or IPV6_ADDRESS_LEN long.
'''
addr_len = get_addr_type_len(addr_type)
assert len(data_bytes) >= addr_len
if addr_type == IPV4_ADDRESS_TYPE:
assert addr_len == IPV4_ADDRESS_LEN
(addr_bytes, remaining_bytes) = split_field(addr_len, data_bytes)
# Some ipaddress variants demand bytearray, others demand bytes
try:
addr_value = ipaddress.IPv4Address(bytearray(addr_bytes))
return (str(addr_value), remaining_bytes)
except ipaddress.AddressValueError:
pass
except UnicodeDecodeError:
pass
addr_value = ipaddress.IPv4Address(bytes(addr_bytes))
elif addr_type == IPV6_ADDRESS_TYPE:
assert addr_len == IPV6_ADDRESS_LEN
(addr_bytes, remaining_bytes) = split_field(addr_len, data_bytes)
try:
addr_value = ipaddress.IPv6Address(bytearray(addr_bytes))
return (str(addr_value), remaining_bytes)
except ipaddress.AddressValueError:
pass
except UnicodeDecodeError:
pass
addr_value = ipaddress.IPv6Address(bytes(addr_bytes))
else:
raise ValueError('Unexpected address type: {}'.format(addr_type))
return (str(addr_value), remaining_bytes)
评论列表
文章目录