|
| 1 | +# RemovedInDjango50Warning |
| 2 | +# Copyright (c) 2010 Guilherme Gondim. All rights reserved. |
| 3 | +# Copyright (c) 2009 Simon Willison. All rights reserved. |
| 4 | +# Copyright (c) 2002 Drew Perttula. All rights reserved. |
| 5 | +# |
| 6 | +# License: |
| 7 | +# Python Software Foundation License version 2 |
| 8 | +# |
| 9 | +# See the file "LICENSE" for terms & conditions for usage, and a DISCLAIMER OF |
| 10 | +# ALL WARRANTIES. |
| 11 | +# |
| 12 | +# This Baseconv distribution contains no GNU General Public Licensed (GPLed) |
| 13 | +# code so it may be used in proprietary projects just like prior ``baseconv`` |
| 14 | +# distributions. |
| 15 | +# |
| 16 | +# All trademarks referenced herein are property of their respective holders. |
| 17 | +# |
| 18 | + |
| 19 | +""" |
| 20 | +Convert numbers from base 10 integers to base X strings and back again. |
| 21 | +
|
| 22 | +Sample usage:: |
| 23 | +
|
| 24 | + >>> base20 = BaseConverter('0123456789abcdefghij') |
| 25 | + >>> base20.encode(1234) |
| 26 | + '31e' |
| 27 | + >>> base20.decode('31e') |
| 28 | + 1234 |
| 29 | + >>> base20.encode(-1234) |
| 30 | + '-31e' |
| 31 | + >>> base20.decode('-31e') |
| 32 | + -1234 |
| 33 | + >>> base11 = BaseConverter('0123456789-', sign='$') |
| 34 | + >>> base11.encode(-1234) |
| 35 | + '$-22' |
| 36 | + >>> base11.decode('$-22') |
| 37 | + -1234 |
| 38 | +
|
| 39 | +""" |
| 40 | +import warnings |
| 41 | + |
| 42 | +from django.utils.deprecation import RemovedInDjango50Warning |
| 43 | + |
| 44 | +warnings.warn( |
| 45 | + "The django.utils.baseconv module is deprecated.", |
| 46 | + category=RemovedInDjango50Warning, |
| 47 | + stacklevel=2, |
| 48 | +) |
| 49 | + |
| 50 | +BASE2_ALPHABET = "01" |
| 51 | +BASE16_ALPHABET = "0123456789ABCDEF" |
| 52 | +BASE56_ALPHABET = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz" |
| 53 | +BASE36_ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyz" |
| 54 | +BASE62_ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" |
| 55 | +BASE64_ALPHABET = BASE62_ALPHABET + "-_" |
| 56 | + |
| 57 | + |
| 58 | +def convert(number, from_digits, to_digits, sign): |
| 59 | + if str(number)[0] == sign: |
| 60 | + number = str(number)[1:] |
| 61 | + neg = 1 |
| 62 | + else: |
| 63 | + neg = 0 |
| 64 | + |
| 65 | + # make an integer out of the number |
| 66 | + x = 0 |
| 67 | + for digit in str(number): |
| 68 | + x = x * len(from_digits) + from_digits.index(digit) |
| 69 | + |
| 70 | + # create the result in base 'len(to_digits)' |
| 71 | + if x == 0: |
| 72 | + res = to_digits[0] |
| 73 | + else: |
| 74 | + res = "" |
| 75 | + while x > 0: |
| 76 | + digit = x % len(to_digits) |
| 77 | + res = to_digits[digit] + res |
| 78 | + x = int(x // len(to_digits)) |
| 79 | + return neg, res |
| 80 | +class BaseConverter: |
| 81 | + decimal_digits = "0123456789" |
| 82 | + |
| 83 | + def __init__(self, digits, sign="-"): |
| 84 | + self.sign = sign |
| 85 | + self.digits = digits |
| 86 | + if sign in self.digits: |
| 87 | + raise ValueError("Sign character found in converter base digits.") |
| 88 | + |
| 89 | + def __repr__(self): |
| 90 | + return "<%s: base%s (%s)>" % ( |
| 91 | + self.__class__.__name__, |
| 92 | + len(self.digits), |
| 93 | + self.digits, |
| 94 | + ) |
| 95 | + |
| 96 | + def encode(self, i): |
| 97 | + neg, value = self.convert(i, self.decimal_digits, self.digits, "-") |
| 98 | + if neg: |
| 99 | + return self.sign + value |
| 100 | + return value |
| 101 | + |
| 102 | + def decode(self, s): |
| 103 | + neg, value = self.convert(s, self.digits, self.decimal_digits, self.sign) |
| 104 | + if neg: |
| 105 | + value = "-" + value |
| 106 | + return int(value) |
| 107 | + |
| 108 | + |
| 109 | + |
| 110 | +base2 = BaseConverter(BASE2_ALPHABET) |
| 111 | +base16 = BaseConverter(BASE16_ALPHABET) |
| 112 | +base36 = BaseConverter(BASE36_ALPHABET) |
| 113 | +base56 = BaseConverter(BASE56_ALPHABET) |
| 114 | +base62 = BaseConverter(BASE62_ALPHABET) |
| 115 | +base64 = BaseConverter(BASE64_ALPHABET, sign="$") |
0 commit comments