Кстати ... base64.b16encode(base64.b16encode(data))
эквивалентно data.encode('hex').encode('hex')
. И есть более простой и быстрый способ сделать отображение,
def tobin(numStr):
return ''.join(("0000","0001","0010","0100","1000","1001","1010","1100","1101","1110")[int(c)] for c in numStr)
Сама идея этого кодирования, хотя и выглядит сложной на первый взгляд, не очень хороша. Во-первых, он не выполняет большую часть шифрования, поскольку каждая цифра из шестнадцатеричного дампа всегда сопоставляется одной и той же строке длиной 8 из 0 и 1 с:
>>> hexd = '0123456789ABCDEF'
>>> s = hexd.encode('hex')
>>> s
'30313233343536373839414243444546'
>>> s=''.join(["0000","0001","0010","0100","1000","1001","1010","1100","1101","1110"][int(c)] for c in s)
>>> s
'01000000010000010100001001000100010010000100100101001010010011000100110101001110100000011000001010000100100010001000100110001010'
>>> for i in range(0,len(s),8):
... print hexd[i/8], s[i:i+8], chr(int(s[i:i+8],2))
...
0 01000000 @
1 01000001 A
2 01000010 B
3 01000100 D
4 01001000 H
5 01001001 I
6 01001010 J
7 01001100 L
8 01001101 M
9 01001110 N
A 10000001
B 10000010 ‚
C 10000100 „
D 10001000 ˆ
E 10001001 ‰
F 10001010 Š
Во-вторых, он увеличивает размер маринованного объекта 16 раз ! Даже если вы упакуете это путем преобразования каждых 8 битов '0' и '1' в байты (скажем, chr(int(encoded[i:i+8],2))
), это все равно будет 2x маринадом.