blob: c5a7ca7586c985bf8b9e21e7488eafa261508c5e [file] [log] [blame]
Guido van Rossumf1945461995-06-14 23:43:44 +00001# Conversions to/from base64 transport encoding as per RFC-MIME (Dec 1991
2# version).
3
4# Parameters set by RFX-XXXX.
Jack Jansen951213e1995-10-04 16:39:20 +00005#
6# Modified 04-Oct-95 by Jack to use binascii module
7
8import binascii
9
Guido van Rossumf1945461995-06-14 23:43:44 +000010MAXLINESIZE = 76 # Excluding the CRLF
Jack Jansen951213e1995-10-04 16:39:20 +000011MAXBINSIZE = (MAXLINESIZE/4)*3
Guido van Rossumf1945461995-06-14 23:43:44 +000012
13# Encode a file.
14def encode(input, output):
Guido van Rossumf1945461995-06-14 23:43:44 +000015 while 1:
Jack Jansen951213e1995-10-04 16:39:20 +000016 s = input.read(MAXBINSIZE)
Guido van Rossumf1945461995-06-14 23:43:44 +000017 if not s: break
Jack Jansen951213e1995-10-04 16:39:20 +000018 while len(s) < MAXBINSIZE:
19 ns = input.read(MAXBINSIZE-len(s))
20 if not ns: break
21 s = s + ns
22 line = binascii.b2a_base64(s)
23 output.write(line)
Guido van Rossumf1945461995-06-14 23:43:44 +000024
25# Decode a file.
26def decode(input, output):
Guido van Rossumf1945461995-06-14 23:43:44 +000027 while 1:
28 line = input.readline()
29 if not line: break
Jack Jansen951213e1995-10-04 16:39:20 +000030 s = binascii.a2b_base64(line)
31 output.write(s)
Guido van Rossumf1945461995-06-14 23:43:44 +000032
33def encodestring(s):
34 import StringIO
35 f = StringIO.StringIO(s)
36 g = StringIO.StringIO()
37 encode(f, g)
38 return g.getvalue()
39
40def decodestring(s):
41 import StringIO
42 f = StringIO.StringIO(s)
43 g = StringIO.StringIO()
44 decode(f, g)
45 return g.getvalue()
46
Guido van Rossum54c15101995-09-18 21:49:24 +000047# Small test program
Guido van Rossumf1945461995-06-14 23:43:44 +000048def test():
Guido van Rossum3b8e1601995-08-10 19:26:37 +000049 import sys, getopt
50 try:
51 opts, args = getopt.getopt(sys.argv[1:], 'deut')
52 except getopt.error, msg:
Guido van Rossum54c15101995-09-18 21:49:24 +000053 sys.stdout = sys.stderr
Guido van Rossum3b8e1601995-08-10 19:26:37 +000054 print msg
55 print """usage: basd64 [-d] [-e] [-u] [-t] [file|-]
56 -d, -u: decode
57 -e: encode (default)
58 -t: decode string 'Aladdin:open sesame'"""
Guido van Rossum54c15101995-09-18 21:49:24 +000059 sys.exit(2)
Guido van Rossum3b8e1601995-08-10 19:26:37 +000060 func = encode
61 for o, a in opts:
62 if o == '-e': func = encode
63 if o == '-d': func = decode
64 if o == '-u': func = decode
65 if o == '-t': test1(); return
66 if args and args[0] != '-':
67 func(open(args[0]), sys.stdout)
Guido van Rossumf1945461995-06-14 23:43:44 +000068 else:
Guido van Rossum3b8e1601995-08-10 19:26:37 +000069 func(sys.stdin, sys.stdout)
Guido van Rossumf1945461995-06-14 23:43:44 +000070
71def test1():
72 s0 = "Aladdin:open sesame"
73 s1 = encodestring(s0)
74 s2 = decodestring(s1)
75 print s0, `s1`, s2
76
77if __name__ == '__main__':
78 test()