Base64를 사용하는 이유
여러가지 이유가 있겠지만,원칙적으로는 바이너리 데이터의 손실을 막기 위해서입니다.바이너리 데이터는 문자열 형태로 변환하면 데이터 손실이 있습니다.예를 들어 C:/Windows/System32/keyboard.drv 라는 파일의 데이터를 읽어 다른 곳으로 전송해줘야 하는데 바이너리 형태로 전송할 방법이 없을 때는어떻게 해야 할까요..그럴 때 사용하는 방법 중 하나입니다. Base64로 인코딩 한 다음에 보내주고, 그 곳에서는 Base64 디코딩을 이용해 데이터를 복원 하게 됩니다.이렇게 하면 데이터 손실을 막을 수 있지요.byte를 String 형태로 바꾸면 어떻게 될까요?간단한 예제를 만들어 보았습니다. public static void main(String[] args) throws IOException { File file = new File("C:/Windows/System32/keyboard.drv"); FileInputStream fin = new FileInputStream(file); int read = -1; byte[] bt = new byte[1024]; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((read=fin.read(bt))!=-1) { bos.write(bt, 0, read); } bos.close(); fin.close(); System.out.println(bos.toByteArray().length); } 원본 파일은 2,000 byte인데 String 형태로 저장하니 2,406 byte가 되어버리네요.반대로 String 형태가 아닌 Binary로 저장하는 방법을 사용해보겠습니다. public static void main(String[] args) throws IOException { File file = new File("C:/Windows/System32/keyboard.drv"); FileInputStream fin = new FileInputStream(file); int read = -1; byte[] bt = new byte[1024]; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((read=fin.read(bt))!=-1) { bos.write(bt, 0, read); } bos.close(); fin.close(); System.out.println(bos.toByteArray().length); } 어떤가요? 2,000 byte 그대로지요?왜 그럴까요? 아주 기본 상식이지만 다시 짚고 넘어가자면기본적으로char 데이터는 non-signed 1byte : 양의 정수 (0~255 표현)byte 데이터는 signed 1byte : 그냥 정수 (-128~127 표현)이기 때문에 음수로 된 byte 데이터는 char가 못 알아먹습니다."난 byte. char에게 -20(ec)을 주었다."=> "난 char. byte한테 236(ec)을 받았다."라고 해석해버리게 되는거죠. 그래서 데이터 손실이 일어나는 겁니다.그리하여 이 데이터를 일정한 규칙에 따라 변환한 뒤 전송해야 하는데이러한 방법 중 하나가 Base64 인코딩입니다. Base64로 전송되면받는 곳에서는 다시 byte 데이터로 복구를 해야 하죠.그러므로 당연히1. Base64 인코딩 - 파라미터 : byte[] , 리턴유형 : String,2. Base64 디코딩 - 파라미터 : String , 리턴유형 : byte[]라는 결과가 나오는 것입니다.
자세히 보기 →


