#-----------------------------------------------------------------------------# 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 ;-)"""fromnetaddr.coreimportAddrFormatErrorfromnetaddr.ipimportIPAddressfromnetaddr.compatimport_zipdefchr_range(low,high):"""Returns all characters between low and high chars."""return[chr(i)foriinrange(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)))
[docs]defipv6_to_base85(addr):"""Convert a regular IPv6 address to base 85."""ip=IPAddress(addr)int_val=int(ip)remainder=[]whileint_val>0:remainder.append(int_val%85)int_val//=85encoded=''.join([BASE_85[w]forwinreversed(remainder)])leading_zeroes=(20-len(encoded))*"0"returnleading_zeroes+encoded
[docs]defbase85_to_ipv6(addr):""" Convert a base 85 IPv6 address to its hexadecimal format. """tokens=list(addr)iflen(tokens)!=20:raiseAddrFormatError('Invalid base 85 IPv6 address: %r'%(addr,))result=0fori,numinenumerate(reversed(tokens)):num=BASE_85_DICT[num]result+=(num*85**i)ip=IPAddress(result,6)returnstr(ip)