현재 진행하는 프로젝트중 PDF를 JSON형식으로 전송해야 하는 케이스가 있었다.
위의 문제를 해결하기 위해 가장 널리 쓰이는 방법이
Base64 알고리즘을 사용해 PDF => Binary Data로 변환하면 된다는 것을 알게되었다.
Base64란
Base64는 서로 다른 저장 매체간에 전송하는 동안 데이터 손상을 방지하기 위해
데이터를 일반텍스트로 변환하는데 사용되는 이진-텍스트 알고리즘이다.
또한 이진데이터를 HTML, CSS, JavaScript, XML과 같은 텍스트 문서에 삽입하는데 자주 사용된다.
Base64는 모든 문자를 라틴문자, 숫자, 더하기 및 슬래시로 구성된 알파벳으로 변환 할 수 있는
인코딩 알고리즘이다.
덕분에 한자, 이모티콘, 이미지까지 읽을 수 있는 문자열로 변화할 수 있으며
문자열을 저장하거나 전송할 수 있다.
(프로젝트가 우선이라 알고리즘은 나중에 시간이 될때 다시 분석해보자!)
사용법
- 이메일을 보낼 때 파일첨부
- 데이터 URI를 통해 HTML 또는 CSS에 이미지 삽입
- 암호화 함수의 원시 바이트 보존
- API 응답에서 Binary Data를 XML 또는 JSON으로 출력
- BLOB을 사용할 수 없을 때 데이터베이스에 이진 파일 저장
(이 방법은 DA의 컨펌을 받지 못했다.
DB는 파일을 저장하는 공간이 아니기 때문에 파일을 TEXT로 인코딩후 저장한다고 해도
DB에 무리가 올수있다고 한다. 저장공간의 부족 등)
그럼 개발적인 측면에서 Base64를 어떻게 사용할까
우리가 보편적으로 사용하는 언어에는 이미 기본적인 함수로 Base64를 지원하고 있다.
JAVA
1
2
3
4
5
6
7
8
9
10
11
|
import java.util.base64;
class Basae64Encode
{
public static void main(string[] args)
{
string str = "abcd";
string b64 = Base64.getEncoder().encodeToString(str.getBytes());
system.out.print(b64);
}
}
|
cs |
디코딩
1
2
3
4
5
6
7
8
9
10
11
12
|
import java.util.base64;
class Basae64Encode
{
public static void main(string[] args)
{
string b64 = "Z3VydQ==";
byte[] decoder = Base64.getDecoder().decode(b64);
string str = new string(decoder);
system.out.print(str);
}
}
|
cs |
Java 1.8 부터 Base64.Encoder 클래스를 사용하여 데이터를 Binary Data로 인코딩/디코딩 할 수 있다.
JavaScript
JavaScript는 인코딩하기위해 btoa "Binary to ASCII"의 약어인 함수를 제공한다.
디코딩은 atob 함수를 사용한다.
1
2
3
4
5
|
var b64 = btoa("abcd");
console.log(b64);
var str = atob(b64);
console.log(str);
|
cs |
C#
C#에서는 Convert Class안에 있는 ToBase64String(); 을 사용한다.
해당 메소드 파라미터값으로 Byte를 넣으면 Binary Data로 변환된다.
1
2
3
4
5
|
Byte[] bytes = File.ReadAllBytes(@"C:\Users\Desktop\xxx.pdf");
string base64String = Convert.ToBase64String(bytes);
Console.WriteLine(basae64String);
Console.ReadaLine();
|
cs |
나는 C#개발자이기 때문에 마지막예제는 내가 실제로 프로젝트 도중 필요로 했던
PDF to Binary Data 변환 예제를 가져왔다.
위의 예제들처럼 많은 언어들이 Base64 알고리즘을 기본적으로 제공하고 있으니 참고해서 유용하게 써먹어보자!