2017-05-07 14:28:55 +02:00
|
|
|
EIGHTBITMASK = 0x80
|
|
|
|
|
SEVENBITSMASK = 0x7f
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def encode_single(n):
|
2017-10-10 06:41:27 +08:00
|
|
|
bytes_ = [n & SEVENBITSMASK]
|
2017-05-07 14:28:55 +02:00
|
|
|
n >>= 7
|
|
|
|
|
|
|
|
|
|
while n > 0:
|
2017-10-10 06:41:27 +08:00
|
|
|
bytes_.append(n & SEVENBITSMASK | EIGHTBITMASK)
|
2017-05-07 14:28:55 +02:00
|
|
|
n >>= 7
|
|
|
|
|
|
2017-10-10 06:41:27 +08:00
|
|
|
return bytes_[::-1]
|
2017-05-07 14:28:55 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def encode(numbers):
|
|
|
|
|
return sum((encode_single(n) for n in numbers), [])
|
|
|
|
|
|
|
|
|
|
|
2017-10-10 06:41:27 +08:00
|
|
|
def decode(bytes_):
|
2017-05-07 14:28:55 +02:00
|
|
|
values = []
|
|
|
|
|
n = 0
|
|
|
|
|
|
2017-10-10 06:41:27 +08:00
|
|
|
for i, byte in enumerate(bytes_):
|
2017-05-07 14:28:55 +02:00
|
|
|
n <<= 7
|
|
|
|
|
n += (byte & SEVENBITSMASK)
|
|
|
|
|
|
|
|
|
|
if byte & EIGHTBITMASK == 0:
|
|
|
|
|
values.append(n)
|
|
|
|
|
n = 0
|
2017-10-10 06:41:27 +08:00
|
|
|
elif i == len(bytes_) - 1:
|
2017-05-07 14:28:55 +02:00
|
|
|
raise ValueError('incomplete byte sequence')
|
|
|
|
|
|
|
|
|
|
return values
|