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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file baseAnything-0.1.0.tar.gz
.
File metadata
- Download URL: baseAnything-0.1.0.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e50f3aed4a3dddb3957933df508effd66141709299c807ea16dab16f4c2bf562 |
|
MD5 | 0a3f39a54fb9f87a819c697c72aa4444 |
|
BLAKE2b-256 | 0630e3c3aecbae0d9d7e02f638ac15f969671119c5880528e0fdf40014e85af4 |
File details
Details for the file baseAnything-0.1.0-py3-none-any.whl
.
File metadata
- Download URL: baseAnything-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.11.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f250fc873ccd679b69f6ceb691bd9e0e26bbcacf9cc36074d183ea8a386a158a |
|
MD5 | cd0b4d0b6758e624aa97218f1ea6159c |
|
BLAKE2b-256 | 34b3a5f1025d3f456a8ff7adaf0b6ce4e3a453c7ceee83037f641a4930ba18de |