chikuchikugonzalezの雑記帳

趣味とか日記とかメモとか(∩゚д゚)

ファイルをBase64にするスクリプト

なんでもはてな記法でシンタックスハイライトができるらしいので、試しにBase64スクリプトを貼り付けてみる

Ruby

#!ruby

def encode(file)
  data = []
  data << file.read
  return data.pack('m')
end

def decode(str, file = nil)
  data = str.unpack('m')[0]

  if file != nil
    file.write(data)
  else
    return data
  end
end

def usage
  $stderr.printf("USAGE: %s [OPTIONS] <source file> [<output file>]\n\n", __FILE__)
  $stderr.printf("OPTIONS:\n")
  $stderr.printf("\t-p,--pack\t\tBase64でエンコードします\n")
  $stderr.printf("\t-u,--unpack\t\tBase64でデコードします\n")
  $stderr.printf("\t<source file>\t\t入力ファイル (必須)\n")
  $stderr.printf("\t<output file>\t\t出力ファイル。指定されない場合は標準出力\n")
end

if __FILE__ == $0
  packMode = false
  unpackMode = false
  sourceFile = nil
  targetFile = nil

  ARGV.each do |arg|
    case arg
    when '-p', '--pack'
      packMode = true
      unpackMode = false
    when '-u', '--unpack'
      packMode = false
      unpackMode = true
    else
      if sourceFile == nil
        sourceFile = arg
      else
        targetFile = arg
      end
    end
  end

  if sourceFile == nil
    usage
  elsif !packMode && !unpackMode
    usage
  else
    open(sourceFile, 'rb') do |file|
      if packMode
        if targetFile != nil
          open(targetFile, 'wb') do |out|
            out.write(encode(file))
          end
        else
          $stdout.write(encode(file))
        end
      elsif unpackMode
        packedData = file.read
        if targetFile != nil
          open(targetFile, 'wb') do |out|
            decode(packedData, out)
          end
        else
          decode(packedData, $stdout)
        end
      end
    end
  end
end

Python

#!python

from __future__ import with_statement
import sys
import codecs
import base64

def usage():
    sys.stderr.write('USAGE: %s OPTIONS <source file> [<output file>]\n\n' % (sys.argv[0]))
    sys.stderr.write('OPTIONS:\n')
    sys.stderr.write(u'\t-p,--pack\t\tBase64でエンコードします\n'.encode(sys.stderr.encoding))
    sys.stderr.write(u'\t-u,--unpack\t\tBase64でデコードします\n'.encode(sys.stderr.encoding))
    sys.stderr.write(u'\t<source file>\t\t入力ファイル (必須)\n'.encode(sys.stderr.encoding))
    sys.stderr.write(u'\t<output file>\t\t出力ファイル。指定されない場合は標準出力\n'.encode(sys.stderr.encoding))

if __name__ == '__main__':
    packMode = False
    unpackMode = False
    sourceFile = None
    outputFile = None

    args = sys.argv[1:]

    for arg in args:
        if arg == '-p' or arg == '--pack':
            packMode = True
        elif arg == '-u' or arg == '--unpack':
            unpackMode = True
        else:
            if sourceFile is None:
                sourceFile = arg
            else:
                outputFile = arg

    if not packMode and not unpackMode:
        usage()
    elif sourceFile is None:
        usage()
    else:
        with file(sourceFile, 'rb') as input:
            if outputFile is None:
                if packMode:
                    base64.encode(input, sys.stdout)
                elif unpackMode:
                    base64.decode(input, sys.stdout)
            else:
                with file(outputFile, 'wb') as out:
                    if packMode:
                        base64.encode(input, out)
                    elif unpackMode:
                        base64.decode(input, out)