General power-of-2 base conversion.
(data, frombits, tobits, pad=True)
| 61 | |
| 62 | |
| 63 | def convertbits(data, frombits, tobits, pad=True): |
| 64 | """General power-of-2 base conversion.""" |
| 65 | acc = 0 |
| 66 | bits = 0 |
| 67 | ret = [] |
| 68 | maxv = (1 << tobits) - 1 |
| 69 | max_acc = (1 << (frombits + tobits - 1)) - 1 |
| 70 | for value in data: |
| 71 | if value < 0 or (value >> frombits): |
| 72 | return None |
| 73 | acc = ((acc << frombits) | value) & max_acc |
| 74 | bits += frombits |
| 75 | while bits >= tobits: |
| 76 | bits -= tobits |
| 77 | ret.append((acc >> bits) & maxv) |
| 78 | if pad: |
| 79 | if bits: |
| 80 | ret.append((acc << (tobits - bits)) & maxv) |
| 81 | elif bits >= frombits or ((acc << (tobits - bits)) & maxv): |
| 82 | return None |
| 83 | return ret |
| 84 | |
| 85 | |
| 86 | def decode(hrp, addr): |