제가 만들어서 쓰고 있는 것입니다.


안드로이드에서 base64 지원하는데 왜 만들었을까요?


알고보니 프로요에서 부터 지원하더군요..


그리고 실제 base64는 웹 관련될 때 사용하니까 실제 필요한 것은 post등의 전송에


바로 사용할 수 있는 커스텀 base64니까요.


뭐 대단한것도 아니고 아래 코드만 봐도 느낌이 오실 것 같네요.


제가 원래 모든 것이 귀찮으니 대충 코드 보시면 어찌 쓸지 감이 오실듯


다소 코딩 스타일이 마음에 안 드시더라도 그냥 이해하시길 ㅎ_ㅎ~!


public class base64{

static byte[] encode_data_original;

static byte[] encode_data_url_safe;

static String charSet_original = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    static String charSet_urlsafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!";

    static{

    encode_data_original = new byte[64];

    encode_data_url_safe = new byte[64];

    for (int i = 0; i<64; i++){

    encode_data_original[i] = (byte)charSet_original.charAt(i);

    encode_data_url_safe[i] = (byte)charSet_urlsafe.charAt(i);

    }

    }

    static String encode(String s){ return encode(s.getBytes()); }

    static String encode(byte[] src){ return real_encode(src,encode_data_original); }

    static byte[] decode(String s){ return real_decode(s,charSet_original); }

    static String encode_url(String s){ return encode(s.getBytes()); }

    static String encode_url(byte[] src){ return real_encode(src,encode_data_url_safe); }

    static byte[] decode_url(String s){ return real_decode(s,charSet_urlsafe); }

    

    protected static String real_encode(byte[] src,byte[] encodeData){

    byte[] result;

    int size_result;

    int data_pos=0,result_pos=0;

    int a,b,c;

    size_result = src.length/3*4;

    if(src.length%3>0) size_result += 4;

    result = new byte[size_result];

    for(int i=0;i<src.length/3;++i){

    a = src[data_pos++];

    b = src[data_pos++];

    c = src[data_pos++];

    result[result_pos++] = encodeData[(a>>2)&0x3f];

    result[result_pos++] = encodeData[((a<<4)&0x30)|((b>>4)&0xf)];

    result[result_pos++] = encodeData[((b<<2)&0x3C)|((c>>6)&0x3)];

    result[result_pos++] = encodeData[c&0x3f];

    }

    switch(src.length%3){

    case 1:{

    a = src[data_pos];

    result[result_pos++] = encodeData[(a>>2)&0x3f];

    result[result_pos++] = encodeData[(a<<4)&0x30];

    result[result_pos++] = '=';

    result[result_pos++] = '=';

    break;

    }

    case 2:{

    a = src[data_pos++];

    b = src[data_pos];

    result[result_pos++] = encodeData[(a>>2)&0x3f];

    result[result_pos++] = encodeData[((a<<4)&0x30)|((b>>4)&0xf)];

    result[result_pos++] = encodeData[((b<<2)&0x3C)];

    result[result_pos++] = '=';

    break;

    }

    default: break;

    }

    return new String(result);

    }

    protected static byte[] real_decode(String s,String charSet){

    int a,b,c,d;

    int len = s.length()/4*3;

    if( s.endsWith("=") ) --len;

    if( s.endsWith("==") ) --len;

    byte[] result = new byte[len];

    int r_pt=0,d_pt=0;

    for(int i=0;i<s.length()/4;++i){

    a = charSet.indexOf(s.charAt(d_pt++));

    b = charSet.indexOf(s.charAt(d_pt++));

    if(s.charAt(d_pt)=='=') c = 0;

else c = charSet.indexOf(s.charAt(d_pt));

d_pt++;

if(s.charAt(d_pt)=='=') d = 0;

else d = charSet.indexOf(s.charAt(d_pt));

d_pt++;

    result[r_pt++] = (byte)(((a<<2)&0xfc)|((b>>4)&0x03));

    if( r_pt >= len ) continue;

    result[r_pt++] = (byte)(((b<<4)&0xf0)|((c>>2)&0x0f));

    if( r_pt >= len ) continue;

    result[r_pt++] = (byte)(((c<<6)&0xc0)|((d)&0x3f));

    }

    return result;

    }

}

profile