[C#] Base64 인코딩, 디코딩하는 방법


Development note/C#  2019. 6. 18. 09:00

안녕하세요. 명월입니다.


이 글은 C#에서 Base64를 다루는 방법을 설명한 글입니다.


base64를 다루는 방법에 대해서 java에서 구현을 해봤는데 아무래도 자주 사용하는 함수이니 C#에서도 구현을 했습니다.

참조 - [Java] Base64 인코딩, 디코딩하는 방법


먼저 base64에 대해서 설명하겠습니다.

base64는 원래는 복잡한 이유와 설명이 있는 데 간단하게 설명하면 우리가 byte 형식으로 되어진 binary데이터를 프로그램 간에 좀 더 다루기 편하게 ascii코드로 이루어진 데이터를 base64라고 합니다.

더 간단하게 이야기 하면 「byte데이터나 stream 데이터를 string 형식으로 표시한 것입니다. 그러나 그 string형식도 encoding에 관계없는 ascii코드로 되어있다.」라고 알고 있으면 이해하기 쉽습니다.

먼저 간단한 파일을 읽어서 base64형식으로 변환하겠습니다.


제 pc의 d드라이브의 work라는 폴더에 hello world라고 작성한 텍스트 파일(test.txt)을 준비했습니다.

그리고 그걸 byte 형식으로 읽어 드려서 base64로 변환하겠습니다.

using System;
using System.IO;

namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
      // d드라이브의 work라는 폴더의 test.txt 파일을 읽어드린다.
      byte[] data = GetFileBinary("d:\\work\\test.txt");
      // base64의 라이브러리에서 encodeToString를 이용해서 byte[] 형식을 String 형식으로 변환합니다.
      var base64data = System.Convert.ToBase64String(data);
      // 콘솔에 결과 출력
      Console.WriteLine(base64data);

      Console.WriteLine("Press any key...");
      Console.ReadKey();
    }
    // 파일 읽어드리는 함수
    private static byte[] GetFileBinary(String filepath)
    {
      var file = new FileInfo(filepath);
      var data = new byte[file.Length];
      using (var stream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
      {
        stream.Read(data, 0, (int)data.Length);
      }
      return data;
    }
  }
}

실행 결과 아래와 같은 결과를 얻었습니다.

그럼 다시 base64로 된 String형식의 데이터를 byte[] 형식으로 읽어서 출력하겠습니다.

class Program
{
  static void Main(string[] args)
  {
    // 위에서 인코딩했던 base64데이터 입니다.
    String base64data = "SGVsbG8gd29ybGQ=";
    // byte형식으로 디코딩합니다.
    byte[] data = System.Convert.FromBase64String(base64data);
    // 결과를 보기 위해 String으로 변환 후 출력하겠습니다.
    Console.WriteLine(Encoding.Default.GetString(data));

    Console.WriteLine("Press any key...");
    Console.ReadKey();
  }
}

실행 결과 아래와 같은 결과를 얻었습니다.

프로그램 간의 통신 시에 사실 base64로 인코딩, 디코딩을 해서 전송을 하면 byte 데이터가 늘어나기 때문에 비효율적이기는 합니다. 그대로 byte데이터를 전송하면 되기 때문이죠.

그러나 이 base64의 데이터가 필요할 때가 있긴 있습니다. 예를 들면 ajax로 파일 전송할 때등 말이죠.

[Jquery] ajax를 이용해 파일 업로드하는 방법 - https://nowonbun.tistory.com/475


또는 byte데이터를 그대로 보관하기는 그렇고 String형식으로 text의 파일로 저장할 때 등도 있습니다.(나름 보안입니다.)

C#으로 작성된 Base64의 인코딩, 디코딩 소개였습니다.