Where The Streets Have No Name

Base64 Encoding & Decoding 본문

Developement/Web

Base64 Encoding & Decoding

highheat 2008. 3. 26. 15:22
출처: http://ilus.tistory.com/81

ex1) Java Package
/*
 * Base64Utils.java
 *
 * Created on 2007년 10월 16일 (화), 오후 2:22
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package fuel.Util;

import sun.misc.*;
import java.io.*;
/**
 *
 * @author ilu
 */
public class Base64Utils
{
   
    /** Creates a new instance of Base64Utils */
    public Base64Utils()
    {
    }
   
    /**
     * Base64Encoding 방식으로 바이트 배열을 아스키 문자열로 인코딩한다.
     * In-Binany, Out-Ascii
     *
     * @param encodeBytes  인코딩할 바이트 배열(byte[])
     * @return  인코딩된 아스키 문자열(String)
     */
   
    public static String encode(byte[] encodeBytes)
    {
        byte[] buf = null;
        String strResult = null;
       
        BASE64Encoder base64Encoder = new BASE64Encoder();
        ByteArrayInputStream bin = new ByteArrayInputStream(encodeBytes);
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
       
        try
        {
            base64Encoder.encodeBuffer(bin, bout);
        }
        catch (Exception e)
        {
            System.out.println("Exception");
            e.printStackTrace();
        }
        buf = bout.toByteArray();
        strResult = new String(buf).trim();
        return strResult;
    }
   
    /**
     * Base64Decoding 방식으로 아스키 문자열을 바이트 배열로 디코딩한다.
     * In-Ascii, Out-Binany
     *
     * @param  strDecode 디코딩할 아스키 문자열(String)
     * @return  디코딩된 바이트 배열(byte[])
     */
    public static byte[] decode(String strDecode)
    {
        byte[] buf = null;
       
        BASE64Decoder base64Decoder = new BASE64Decoder();
        ByteArrayInputStream bin = new ByteArrayInputStream(strDecode.getBytes());
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
       
        try
        {
            base64Decoder.decodeBuffer(bin, bout);
        }
        catch (Exception e)
        {
            System.out.println("Exception");
            e.printStackTrace();
        }
        buf = bout.toByteArray();
        return buf;
    }
//    public static void main(String args[])
//    {
//        String strOrgin = "Monky";
//        String strDecode = null;
//        byte[] bytOrgin = strOrgin.getBytes();
//        System.out.println("OriginString=" + strOrgin);
//       
//        String strEncoded = Base64Utils.encode(bytOrgin);
//        System.out.println("EncodedString=" + strEncoded);
//       
//        byte[] bytDecoded = Base64Utils.decode(strEncoded);
//        strDecode = new String(bytDecoded);
//        System.out.println("DecodedString=" + strDecode);
//    }
   
}



ex2) Java Script



/*  Encode & Decode Javascript */
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function encode64(input) {

   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);
  
   return output;
}



function decode64(input)
{
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
   input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

   do {
      enc1 = keyStr.indexOf(input.charAt(i++));
      enc2 = keyStr.indexOf(input.charAt(i++));
      enc3 = keyStr.indexOf(input.charAt(i++));
      enc4 = keyStr.indexOf(input.charAt(i++));

      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;

      output = output + String.fromCharCode(chr1);

      if (enc3 != 64) {
         output = output + String.fromCharCode(chr2);
      }
      if (enc4 != 64) {
         output = output + String.fromCharCode(chr3);
      }
   } while (i < input.length);

   return output;
}


function encode64Han(str)
{
  return encode64(escape(str))
}


function decode64Han(str)
{
  return unescape(decode64(str))
}



encodeHan,decodeHan을 사용해야 한글이 정사적으로 처리됨

php와 연동해서 테스트한결과 아래 소스 두가지에서 정상적으로 처리됨

ex1)
<?
$name = base64_decode($_GET[name]);
header("Content-type: text/html;charset=utf-8");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
echo iconv("CP949","UTF-8", base64_encode($name));
?>

ex2)
<?
$name = base64_decode($_GET[name]);
header("Content-type: text/html;charset=euc-kr");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
echo base64_encode($name);
?>