| #! /usr/bin/env python |
| |
| """Conversions to/from base64 transport encoding as per RFC-1521.""" |
| |
| # Modified 04-Oct-95 by Jack to use binascii module |
| |
| import binascii |
| |
| MAXLINESIZE = 76 # Excluding the CRLF |
| MAXBINSIZE = (MAXLINESIZE/4)*3 |
| |
| def encode(input, output): |
| """Encode a file.""" |
| while 1: |
| s = input.read(MAXBINSIZE) |
| if not s: break |
| while len(s) < MAXBINSIZE: |
| ns = input.read(MAXBINSIZE-len(s)) |
| if not ns: break |
| s = s + ns |
| line = binascii.b2a_base64(s) |
| output.write(line) |
| |
| def decode(input, output): |
| """Decode a file.""" |
| while 1: |
| line = input.readline() |
| if not line: break |
| s = binascii.a2b_base64(line) |
| output.write(s) |
| |
| def encodestring(s): |
| """Encode a string.""" |
| import StringIO |
| f = StringIO.StringIO(s) |
| g = StringIO.StringIO() |
| encode(f, g) |
| return g.getvalue() |
| |
| def decodestring(s): |
| """Decode a string.""" |
| import StringIO |
| f = StringIO.StringIO(s) |
| g = StringIO.StringIO() |
| decode(f, g) |
| return g.getvalue() |
| |
| def test(): |
| """Small test program""" |
| import sys, getopt |
| try: |
| opts, args = getopt.getopt(sys.argv[1:], 'deut') |
| except getopt.error, msg: |
| sys.stdout = sys.stderr |
| print msg |
| print """usage: basd64 [-d] [-e] [-u] [-t] [file|-] |
| -d, -u: decode |
| -e: encode (default) |
| -t: decode string 'Aladdin:open sesame'""" |
| sys.exit(2) |
| func = encode |
| for o, a in opts: |
| if o == '-e': func = encode |
| if o == '-d': func = decode |
| if o == '-u': func = decode |
| if o == '-t': test1(); return |
| if args and args[0] != '-': |
| func(open(args[0], 'rb'), sys.stdout) |
| else: |
| func(sys.stdin, sys.stdout) |
| |
| def test1(): |
| s0 = "Aladdin:open sesame" |
| s1 = encodestring(s0) |
| s2 = decodestring(s1) |
| print s0, `s1`, s2 |
| |
| if __name__ == '__main__': |
| test() |