본문 바로가기
알고리즘/SWEA

[SWEA] 1928. Base64 Decoder

by hyerann 2019. 4. 26.

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PR4DKAG0DFAUq&categoryId=AV5PR4DKAG0DFAUq&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

www.swexpertacademy.com

이 문제는 문제 조차 이해하지 못해서 구글링해서 찾아봤다.

(참고: https://zetawiki.com/wiki/SWEA_1928_Base64_Decoder)

  • Base64 Encoding: 8bit X 3글자 → 6bit X 4글자 변환
  • Base64 Decoding: 6bit X 4글자 → 8bit X 3글자 변환

Base64는 말그대로 64진수(6bit=2^6=64)로 변환하는 의미라고 한다.

Base64 Encoding을 하면 제어문자와 같이 바이너리를 직접 표시하면 읽을 수 없는 문자들을 알파벳, 숫자, 기호와 같이 읽을 수 있는 문자로 바꿔주고, URL 파라미터로 처리하는 것이 간편해지는 장점이 있다고 한다.

단점이라면 3글자를 4글자로 바꾸므로 크기가 33% 정도 증가한다는 점이 있다고 한다.

사실 나는 아직도 이해하지 못했다...T_T

#include <iostream>
#include <ios>
using namespace std;

int T, m[128];
char encoded[100000], decoded[100000];
void init();
void decode(char* src, char* dst);

int main() {
	cin.tie(0); ios::sync_with_stdio(0);
	init();
	cin >> T;
	for (int tc = 1; tc <= T; tc++) {
		cin >> encoded;
		decode(encoded, decoded);
		cout << '#' << tc << ' ' << decoded << "\n";
	}
}

void init() {
	for (int i = 0; i<26; i++) m['A' + i] = i;
	for (int i = 0; i<26; i++) m['a' + i] = 26 + i;
	for (int i = 0; i<11; i++) m['0' + i] = 52 + i;
	m['+'] = 62;
	m['/'] = 63;
}

void decode(char* src, char* dst) {
	int bits, pos = 0, pos2 = 0;
	while (src[pos]) {
		bits = m[src[pos++]] << 18;
		bits += m[src[pos++]] << 12;
		bits += m[src[pos++]] << 6;
		bits += m[src[pos++]];
		dst[pos2++] = bits >> 16 & 0xFF;
		dst[pos2++] = bits >> 8 & 0xFF;
		dst[pos2++] = bits & 0xFF;
	}
	dst[pos2] = 0;
}

댓글