diff options
Diffstat (limited to 'netaddr/ip/rfc1924.py')
-rw-r--r-- | netaddr/ip/rfc1924.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/netaddr/ip/rfc1924.py b/netaddr/ip/rfc1924.py new file mode 100644 index 0000000..54fb96c --- /dev/null +++ b/netaddr/ip/rfc1924.py @@ -0,0 +1,61 @@ +#----------------------------------------------------------------------------- +# Copyright (c) 2008 by David P. D. Moss. All rights reserved. +# +# Released under the BSD license. See the LICENSE file for details. +#----------------------------------------------------------------------------- +"""A basic implementation of RFC 1924 ;-)""" + +from netaddr.core import AddrFormatError +from netaddr.ip import IPAddress + +from netaddr.compat import _zip + + +def chr_range(low, high): + """Returns all characters between low and high chars.""" + return [chr(i) for i in range(ord(low), ord(high) + 1)] + +#: Base 85 integer index to character lookup table. +BASE_85 = ( + chr_range('0', '9') + chr_range('A', 'Z') + + chr_range('a', 'z') + + ['!', '#', '$', '%', '&', '(', ')', '*', '+', '-', ';', '<', '=', '>', + '?', '@', '^', '_', '`', '{', '|', '}', '~'] +) + +#: Base 85 digit to integer lookup table. +BASE_85_DICT = dict(_zip(BASE_85, range(0, 86))) + + +def ipv6_to_base85(addr): + """Convert a regular IPv6 address to base 85.""" + ip = IPAddress(addr) + int_val = int(ip) + + remainder = [] + while int_val > 0: + remainder.append(int_val % 85) + int_val //= 85 + + encoded = ''.join([BASE_85[w] for w in reversed(remainder)]) + leading_zeroes = (20 - len(encoded)) * "0" + return leading_zeroes + encoded + + +def base85_to_ipv6(addr): + """ + Convert a base 85 IPv6 address to its hexadecimal format. + """ + tokens = list(addr) + + if len(tokens) != 20: + raise AddrFormatError('Invalid base 85 IPv6 address: %r' % (addr,)) + + result = 0 + for i, num in enumerate(reversed(tokens)): + num = BASE_85_DICT[num] + result += (num * 85 ** i) + + ip = IPAddress(result, 6) + + return str(ip) |