進数変換(基数変換)による文字列圧縮

16進数文字列を生成するプログラム(変更不可)の出力結果を、
"50ByteまでのASCIIコードのみ送信できる無線モジュール"を
利用して他ノードへ送りたい時があったのですが、
そのまま16進数文字列を送ってしまうと通信量的に勿体無いので、
可逆圧縮できるプログラムを書きました。

用途は超限定的だと思われますが、GitHubに上げたので
リンクしておきます。

python3 test.py で実行できます。


実行例) 16進数文字列 → 94進数文字列への変換
f:id:raihun:20171008170428p:plain


応用例1) 2進数文字列 → 94進数文字列への変換
Compress.Compress()に渡す引数によって、
n進数からm進数への変換を指定できます。

def main(argc, argv):
    plain = "10111101111000000011100001101101101011101111010001"  # sample data
    print("元データ({0:4d}):{1}".format(len(plain), plain))

    compress = Compress.Compress(2, 94)
    compressed = compress.compress(plain)
    print("圧縮  ({0:4d}):{1}".format(len(compressed), compressed))
    uncompressed = compress.uncompress(compressed)
    print("解凍  ({0:4d}):{1}".format(len(uncompressed), uncompressed))
    return

f:id:raihun:20171008171320p:plain


応用例2) 10進数文字列 → 32進数文字列への変換

def main(argc, argv):
    plain = "396733854690050049480797304"  # sample data
    print("元データ({0:4d}):{1}".format(len(plain), plain))

    compress = Compress.Compress(10, 32)
    compressed = compress.compress(plain)
    print("圧縮  ({0:4d}):{1}".format(len(compressed), compressed))
    uncompressed = compress.uncompress(compressed)
    print("解凍  ({0:4d}):{1}".format(len(uncompressed), uncompressed))
    return

f:id:raihun:20171008171744p:plain


注意点
生成(圧縮)されたASCIIコードは、印字可能文字の2文字目(0x21)から
割り当てているため、n進数 → 10進数の場合でも記号文字が入ります。

Compress.py内の __compress()及び__uncompress()内を
書き換えることによって、62進数までを[0-9][a-z][A-Z]、
それ以降を残りの記号文字に割り当てることができるかと思います。