Base64를 사용하는 이유
<p>여러가지 이유가 있겠지만,</p><p>원칙적으로는 바이너리 데이터의 손실을 막기 위해서입니다.</p><p></p><p>바이너리 데이터는 문자열 형태로 변환하면 데이터 손실이 있습니다.</p><p></p><p>예를 들어 C:/Windows/System32/keyboard.drv 라는 파일의 데이터를 읽어 </p><p>다른 곳으로 전송해줘야 하는데 바이너리 형태로 전송할 방법이 없을 때는</p><p>어떻게 해야 할까요..</p><p></p><p>그럴 때 사용하는 방법 중 하나입니다. </p><p></p><p>Base64로 인코딩 한 다음에 보내주고, </p><p>그 곳에서는 Base64 디코딩을 이용해 데이터를 복원 하게 됩니다.</p><p>이렇게 하면 데이터 손실을 막을 수 있지요.</p><p></p><p>byte를 String 형태로 바꾸면 어떻게 될까요?</p><p>간단한 예제를 만들어 보았습니다.</p><p></p><pre data-language="java"> 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); } </pre><p><img src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></p><p></p><p>원본 파일은 2,000 byte인데 </p><p>String 형태로 저장하니 2,406 byte가 되어버리네요.</p><p></p><p>반대로 String 형태가 아닌 Binary로 저장하는 방법을 사용해보겠습니다.</p><pre data-language="java"> 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); } </pre><p><img src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></p><p></p><p>어떤가요? 2,000 byte 그대로지요?</p><p>왜 그럴까요? 아주 기본 상식이지만 다시 짚고 넘어가자면</p><p></p><p>기본적으로</p><p></p><p>char 데이터는 non-signed 1byte : 양의 정수 (0~255 표현)</p><p>byte 데이터는 signed 1byte : 그냥 정수 (-128~127 표현)</p><p></p><p>이기 때문에 음수로 된 byte 데이터는 char가 못 알아먹습니다.</p><p></p><p>"난 byte. char에게 -20(ec)을 주었다."</p><p>=> "난 char. byte한테 236(ec)을 받았다."</p><p></p><p>라고 해석해버리게 되는거죠. 그래서 데이터 손실이 일어나는 겁니다.</p><p></p><p>그리하여 이 데이터를 일정한 규칙에 따라 변환한 뒤 전송해야 하는데</p><p>이러한 방법 중 하나가 Base64 인코딩입니다. Base64로 전송되면</p><p>받는 곳에서는 다시 byte 데이터로 복구를 해야 하죠.</p><p></p><p>그러므로 당연히</p><p></p><p>1. Base64 인코딩 - 파라미터 : byte[] , 리턴유형 : String,</p><p>2. Base64 디코딩 - 파라미터 : String , 리턴유형 : byte[]</p><p></p><p>라는 결과가 나오는 것입니다.</p><p></p>



