chiark / gitweb /
bug fix and encode func
[secnet.git] / base91.py
index b91614e249c17055403a7f5495f0122593db4968..60bfa04762d698e41821f32bac9928774b5226c2 100644 (file)
--- a/base91.py
+++ b/base91.py
@@ -1,6 +1,6 @@
 import struct
 
-basE91_alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+base91_alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
        'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
        'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
@@ -8,17 +8,18 @@ basE91_alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', '
        '%', '&', '(', ')', '*', '+', ',', '.', '/', ':', ';', '<', '=',
        '>', '?', '@', '[', ']', '^', '_', '`', '{', '|', '}', '~', '"']
 
-decode_table = dict((v,k) for k,v in enumerate(basE91_alphabet))
+decode_table = dict((v,k) for k,v in enumerate(base91_alphabet))
 
-def base91_decode(encoded_str):
+def decode(encoded_str):
+    ''' Decode Base91 string to a bytearray '''
     v = -1
     b = 0
     n = 0
     out = bytearray()
     for strletter in encoded_str:
-        if not strletter in dectable:
+        if not strletter in decode_table:
             continue
-        c = dectable[strletter]
+        c = decode_table[strletter]
         if(v < 0):
             v = c
         else:
@@ -36,3 +37,33 @@ def base91_decode(encoded_str):
         out += struct.pack('B', (b | v << n) & 255 )
     return out
     
+def encode(bindata):
+    ''' Encode a bytearray to a Base91 string '''
+    l = len(bindata)
+    b = 0
+    n = 0
+    out = ''
+    for byte in bindata:
+        b |= struct.unpack('B', byte)[0] << n
+        n += 8
+        if n>13:
+            v = b & 8191
+            if v > 88:
+                b >>= 13
+                n -= 13
+            else:
+                v = b & 16383
+                b >>= 14
+                n -= 14
+            out += base91_alphabet[v % 91] + base91_alphabet[v / 91]
+    if n:
+        out += base91_alphabet[b % 91]
+        if n>7 or b>90:
+            out += base91_alphabet[b / 91]
+    return out
+
+
+
+
+
+