Source code for base255
#!/usr/bin/env python
"""
base255 strings.
You can think of them as a string representation of a number (serialized), and also as a null-terminatable number without any
practical limit on how large a number it can store
"""
# The representation with these "base255" strings, is:
# A series of values, from 1 to 255, which when multiplied suitably, yield the original number.
# The base255 representation will never contain a null (except optionally at the end), which means that you can
# separate them with nulls in a string
# The least significant 1..255 will always be the first character of the string
# The encoding overhead should be pretty low, since we're really only dropping 1 value per byte
# Note that this cannot represent numbers < 0. 0 is represented as a control-A. But non-negative integers should be fine.
import sys
null_byte = bytes([0])
[docs]def number_to_base255(number):
"""Convert a number to a base255 string."""
# least significant "byte" will be first in result
byte255_list = []
# take it apart as a series of numbers
while number != 0:
byte255_list.append((number % 255) + 1)
number = number // 255
if byte255_list == []:
byte255_list.append(0 + 1)
byte255_list.reverse()
return bytes(byte255_list)
[docs]def base255_to_number(base255):
"""Convert a base255 string back to a number."""
if base255[-1:] == null_byte:
temp = base255[:-1]
else:
temp = base255
if null_byte in temp:
sys.stderr.write('Misplaced null in base255\n')
# least signficant "byte" is first in base255
list_ = temp
list_minus_1 = [x - 1 for x in list_]
number = 0
for byte255 in list_minus_1:
number = number * 255 + byte255
return number