[pypy-svn] r10041 - pypy/dist/pypy/lib
jacob at codespeak.net
jacob at codespeak.net
Tue Mar 22 00:25:59 CET 2005
Author: jacob
Date: Tue Mar 22 00:25:59 2005
New Revision: 10041
Modified:
pypy/dist/pypy/lib/binascii.py
Log:
Added support for base64 encoding/decoding.
Modified: pypy/dist/pypy/lib/binascii.py
==============================================================================
--- pypy/dist/pypy/lib/binascii.py (original)
+++ pypy/dist/pypy/lib/binascii.py Tue Mar 22 00:25:59 2005
@@ -59,32 +59,143 @@
s = s[3:]
yield ord(a), ord(b), ord(c)
+
+table_a2b_base64 = {
+ 'A': 0,
+ 'B': 1,
+ 'C': 2,
+ 'D': 3,
+ 'E': 4,
+ 'F': 5,
+ 'G': 6,
+ 'H': 7,
+ 'I': 8,
+ 'J': 9,
+ 'K': 10,
+ 'L': 11,
+ 'M': 12,
+ 'N': 13,
+ 'O': 14,
+ 'P': 15,
+ 'Q': 16,
+ 'R': 17,
+ 'S': 18,
+ 'T': 19,
+ 'U': 20,
+ 'V': 21,
+ 'W': 22,
+ 'X': 23,
+ 'Y': 24,
+ 'Z': 25,
+ 'a': 26,
+ 'b': 27,
+ 'c': 28,
+ 'd': 29,
+ 'e': 30,
+ 'f': 31,
+ 'g': 32,
+ 'h': 33,
+ 'i': 34,
+ 'j': 35,
+ 'k': 36,
+ 'l': 37,
+ 'm': 38,
+ 'n': 39,
+ 'o': 40,
+ 'p': 41,
+ 'q': 42,
+ 'r': 43,
+ 's': 44,
+ 't': 45,
+ 'u': 46,
+ 'v': 47,
+ 'w': 48,
+ 'x': 49,
+ 'y': 50,
+ 'z': 51,
+ '0': 52,
+ '1': 53,
+ '2': 54,
+ '3': 55,
+ '4': 56,
+ '5': 57,
+ '6': 58,
+ '7': 59,
+ '8': 60,
+ '9': 61,
+ '+': 62,
+ '/': 63,
+}
+
+def quadruplets_base64(s):
+ while s:
+ a, b, c, d = table_a2b_base64[s[0]], table_a2b_base64[s[1]], table_a2b_base64[s[2]], table_a2b_base64[s[3]]
+ s = s[4:]
+ yield a, b, c, d
+
+def a2b_base64(s):
+ s = s.rstrip()
+ a = quadruplets_base64(s[:-4])
+ result = [
+ chr(A << 2 | ((B >> 4) & 0x3)) +
+ chr((B & 0xF) << 4 | ((C >> 2 ) & 0xF)) +
+ chr((C & 0xF) << 6 | D )
+ for A, B, C, D in a]
+ final = s[-4:]
+ if final[2] == '=':
+ A = table_a2b_base64[final[0]]
+ B = table_a2b_base64[final[1]]
+ snippet = chr(A << 2 | ((B >> 4) & 0x3))
+ elif final[3] == '=':
+ A = table_a2b_base64[final[0]]
+ B = table_a2b_base64[final[1]]
+ C = table_a2b_base64[final[2]]
+ snippet = chr(A << 2 | ((B >> 4) & 0x3)) + \
+ chr((B & 0xF) << 4 | ((C >> 2 ) & 0xF))
+ else:
+ A = table_a2b_base64[final[0]]
+ B = table_a2b_base64[final[1]]
+ C = table_a2b_base64[final[2]]
+ D = table_a2b_base64[final[3]]
+ snippet = chr(A << 2 | ((B >> 4) & 0x3)) + \
+ chr((B & 0xF) << 4 | ((C >> 2 ) & 0xF)) + \
+ chr((C & 0xF) << 6 | D )
+
+ return ''.join(result) + snippet
+
+table_b2a_base64 = \
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
+
def b2a_base64(s):
length = len(s)
final_length = length % 3
- a = triples(s[:length - final_length])
+ a = triples(s[: -final_length])
+
result = [''.join(
- [chr(0x20 + (( A >> 2 ) & 0x3F)),
- chr(0x20 + (((A << 4) | ((B >> 4) & 0xF)) & 0x3F)),
- chr(0x20 + (((B << 2) | ((C >> 6) & 0x3)) & 0x3F)),
- chr(0x20 + (( C ) & 0x3F))]) for A, B, C in a]
- final = s[length - final_length:]
+ [table_b2a_base64[( A >> 2 ) & 0x3F],
+ table_b2a_base64[((A << 4) | ((B >> 4) & 0xF)) & 0x3F],
+ table_b2a_base64[((B << 2) | ((C >> 6) & 0x3)) & 0x3F],
+ table_b2a_base64[( C ) & 0x3F]])
+ for A, B, C in a]
+
+ final = s[-final_length:]
if len(final) == 0:
snippet = ''
elif len(final) == 1:
a = ord(final[0])
- print a
- snippet = chr(0x20 + ((a >> 2 ) & 0x3F)) + \
- chr((0x20 + (a << 4 )) & 0x3F) + '=='
+ snippet = table_b2a_base64[(a >> 2 ) & 0x3F] + \
+ table_b2a_base64[(a << 4 ) & 0x3F] + '=='
else:
a = ord(final[0])
b = ord(final[1])
- snippet = chr(0x20 + ((a >> 2 ) & 0x3F)) + \
- chr(0x20 + (((a << 4) | ((b >> 4) & 0xF))
- & 0x3F)) + chr((0x20 + (b << 2)) & 0x3F) + '='
+ snippet = table_b2a_base64[(a >> 2) & 0x3F] + \
+ table_b2a_base64[(a << 4) | ((b >> 4) & 0xF) & 0x3F] + \
+ table_b2a_base64[(b << 2) & 0x3F] + '='
return ''.join(result) + snippet + '\n'
+
+
#print b2a_uu('1234567')
#print b2a_uu('123456789012345678901234567890123456789012345')
#print b2a_uu('1234567890123456789012345678901234567890123456')
More information about the Pypy-commit
mailing list