Skip to main content

baseAnything - encode/decode any integer into/from a series of symbols of a custom palette.

Project description

baseAnything

What

A library for encoding integers into a series of symbols. The symbols can be anything. And it decodes too, of course.

Testing

Run test.py.

Howto

Install it (eg pip install baseAnything), and then from baseAnything import baseX. Examples, from the doctests:

Basic use

>>> bxbinary = baseX('01')  # Instantiates a baseX object with a Base-2 aka binary string-symbol alphabet
>>> bxbinary % 7
'111'

Proof: A roundtrip

>>> bxhexadecimal = baseX('0123456789ABCDEF')  # Base-16 aka hexadecimal
>>> 9000 == int(bxhexadecimal % 9000, base=16)
True

Arbitrary symbols

One can use arbitrary symbols. Anything. ['bla', 2, object(), object()] is a valid symbol alphabet.

It may be desirable to get a symbol list back rather than a string, so that the symbol framing is kept intact — because, for instance, a symbol alphabet of ['a', 'aa'] yields ambiguity in its output when it's mashed into a string; 'aaa' has 3 possible interpretations.

The % operator yields strings when encoding an integer. The / operator makes a baseX object return the encoding as a list of symbols instead.

>>> bxfunky = baseX(['Do', 'Re', 'Mi', 'Fa', 'Sol', 'La', 'Ti'])
>>> bxfunky % 10  # Emits a warning, because the result may not be decodable!
'ReFa'
>>> bxfunky / 10  # Symbols returned as a list rather than concatenated into a string.
['Re', 'Fa']
>>> 10 == bxfunky / (bxfunky / 10)
True

Bizarre encodings

Speaking of arbitrary symbols... how about this visually compact encoding:

>>> bxbizarre = baseX(list(map(chr, range(0x0300, 0x036f))))  # unicode diacritical marks
>>> wut = 'O' + bxbizarre % 1234567890
>>> wut
'Ơ̡͎̈̎'
>>> bxbizarre / wut[1:]
1234567890

I don't like the operator overloading interface

Then use baseX.decode(input: Sequence) and baseX.encode(num: int).

Bugs

There are problems when using large numbers.

>>> base22 = baseX(list(range(22)))
>>> largenumber = (base22 / base22.alphabet)  # that's 774212873841767703847271481
>>> base22 / (base22 / largenumber) == largenumber
False  # But it should be true.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

baseAnything-0.1.0.tar.gz (8.9 kB view hashes)

Uploaded Source

Built Distribution

baseAnything-0.1.0-py3-none-any.whl (10.0 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page