제가 만들어서 쓰고 있는 것입니다.
안드로이드에서 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;
}
}