[[練習問題]]
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 import sys
 from string import ascii_lowercase, ascii_uppercase
 
 table = ascii_uppercase + ascii_lowercase + ''.join(map(str, range(10))) + '+/'
 
 def binstr(n, maxbits=None):
     absn = abs(n)
     s = [chr(((n>>b)&1)+48) for b in range(maxbits or len(hex(n))*4) if maxbits or absn>>b or not b or (n<0 and absn>>(b-1)) ]
     s = [ chr(((n>>b)&1)+48) for b in range(maxbits or len(hex(n))*4) if maxbits or absn>>b or not b or (n<0 and absn>>(b-1)) ]
     return ''.join(reversed(s))
             
 
 def encode(filename):
     with open(filename, 'rb') as F:
         bit = ''.join(binstr(ord(x), 8) for x in F.read())
     sz = len(bit)
     fill = 6 - sz % 6
     bit += '0' * fill
     sz += fill
     res = ''.join(table[int(bit[i:i+6], 2)] for i in range(0, sz, 6))
     return res + '=' * (4 - len(res) % 4)
 
 def decode(filename):
     with open(filename, 'rb') as F:
         bit = ''.join(format(table.find(x), 'b').zfill(6) for x in F.read() if x in table)
     while len(bit) % 8 > 0 and bit[-1] == '0':
         bit = bit[:-1]
     sz = len(bit)
     extra = 0
     while (sz-extra) % 8 > 0 and bit[-extra-1] == '0':
         extra += 1
     bit = bit[:-extra-1]
     sz -= extra
     res = ''.join(chr(int(bit[i:i+8], 2)) for i in range(0, sz, 8))
     return res
 
 N = 76
 option = sys.argv[1]
 res = ''
 if option == '-e':
     encoded = encode(sys.argv[2])
     res = '\n'.join(encoded[i:i+N] for i in range(0, len(encoded), N))
     print(res)
 elif option == '-d':
     res = decode(sys.argv[2])
     sys.stdout.write(res)
 else:
     sys.stderr.write('Huh?\n')


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS