본문 바로가기

TechLog

c#에서의 Base64 인코딩 변환

 

Base64가 무엇인지에 대해서는 다음 링크를 참조하시고 : http://ko.wikipedia.org/wiki/Base64

간단히 말하자면 바이너리 데이터를 텍스트로 표현하기 위한 인코딩이라고 생각하면 된다. 일반적인 바이너리 데이터는 텍스트 형태로 외부에 전달할 수 없지만, Base64를 사용하면 바이너리 데이터를 텍스트 형태로 전달할 수 있게 된다. 이러한 특성을 사용하면 이미지를 포함하고 있는 html 페이지를 만든다던가, 여튼 텍스트 기반의 데이터에 바이너리 데이터를 포함시킬 수 있다.

 

c#에서의 base64 인코딩 문법은 상당히 단순하다 :

byte[] bytes;
string base64EncodedString = Convert.ToBase64String(FileBytes, Base64FormattingOptions.None);

 

디코딩도 마찬가지, 단순하다 :

string base64EncodedString;
byte[] output = Convert.FromBase64String(base64EncodedString);

 

갑자기 base64 얘기가 왜 나왔느냐 하면 … 케냘은 최근 웹 상에서의 관리 프로그램 비슷한 것을 만들고 있다. 웹 상에서 파일을 업로드하고 DB에서 해당 항목을 관리해야 하는 경우, 일반적으로 파일을 디스크 상에 저장하고 파일 이름(혹은 url)을 DB에 저장하는 방법을 많이 사용한다. 이러한 방법은 DBMS와 서버의 파일 시스템을 둘 다 관리해주어야 한다는 점 때문에, 차후 서버 이전 등에 문제가 되기도 한다. (최근의 DBMS 중에서는 이러한 파일 액세스 관련 기능을 따로 제공하는 경우도 있다)

그리하여 파일 데이터를 아예 DB에 저장해두는 방법을 생각해 볼 수 있는데, 프론트엔드에서 이러한 파일 데이터를 사용할 때 ① http를 통해서  ② 다수의 파일을 전송받아야 하는 경우가 생겼다. 사실 데이터 포맷은 그다지 중요하지 않아서 바이너리든 xml이든 json이든 그냥 전송하면 되긴 하는데, 여러 개의 파일을 동시에 전송하다보니 중간에 패킷 로스가 생기는 경우도 염두에 두어야 하는 상황이었다.

그래서 all or nothing 방식으로 모든 파일을 전달받으려고 궁리를 하다보니 데이터를 몽땅 base64 형식으로 인코딩해서 json 형식으로 전송하면 되겠구나, 라는 결론을 내렸다는 이야기.