여러가지 이유가 있겠지만,
원칙적으로는 바이너리 데이터의 손실을 막기 위해서입니다.
바이너리 데이터는 문자열 형태로 변환하면 데이터 손실이 있습니다.
예를 들어 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];
String str="";
while((read=fin.read(bt))!=-1) {
str += new String(bt, 0, read);
}
fin.close();
System.out.println(str.getBytes().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[]
라는 결과가 나오는 것입니다.
'개발이야기 > java' 카테고리의 다른 글
Instagram4j - Maven Dependency (0) | 2022.01.14 |
---|---|
x진법 (최대 62진수) 까지 표현해주는 함수 (0) | 2022.01.14 |
정렬 - Selection Sort (0) | 2022.01.13 |
jdbc로 mssql 2008 접근시 무한루프, 무한대기 상태에 빠지는 경우 (0) | 2022.01.13 |
자원반납(null할당) 에 대한 의견 (0) | 2022.01.13 |