General power-of-2 base conversion.
(data, frombits, tobits, pad=True)
| 77 | |
| 78 | |
| 79 | def convertbits(data, frombits, tobits, pad=True): |
| 80 | """General power-of-2 base conversion.""" |
| 81 | acc = 0 |
| 82 | bits = 0 |
| 83 | ret = [] |
| 84 | maxv = (1 << tobits) - 1 |
| 85 | max_acc = (1 << (frombits + tobits - 1)) - 1 |
| 86 | for value in data: |
| 87 | if value < 0 or (value >> frombits): |
| 88 | return None |
| 89 | acc = ((acc << frombits) | value) & max_acc |
| 90 | bits += frombits |
| 91 | while bits >= tobits: |
| 92 | bits -= tobits |
| 93 | ret.append((acc >> bits) & maxv) |
| 94 | if pad: |
| 95 | if bits: |
| 96 | ret.append((acc << (tobits - bits)) & maxv) |
| 97 | elif bits >= frombits or ((acc << (tobits - bits)) & maxv): |
| 98 | return None |
| 99 | return ret |
| 100 | |
| 101 | |
| 102 | def decode(hrp, addr): |