11
01

 

1928. Base64 Decode ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด ์ •๋‹ต๋ฅ ์ด ๊ต‰์žฅํžˆ ๋†’๋‹ค.

ํ•œ๋งˆ๋””๋กœ Base64 ์ธ์ฝ”๋”ฉ ๋œ ๋ฌธ์ž์—ด์„ ๋””์ฝ”๋”ฉํ•ด์„œ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋ผ์„œ java.util.Base64 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ’€๋ฆฐ๋‹ค.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์“ฐ๋Š” ๊ฑด ๋ช‡ ์ค„๋กœ ํ’€๋ฆฌ๋‹ˆ๊นŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ๊ตฌํ˜„ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜ ๋ดค๋‹ค.

 

final String base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int[] base64Mapping = new int[64];

for (int i = 0; i < base64Chars.length(); i++) {
    base64Mapping[base64Chars.charAt(i)] = i;
}

StringBuilder result = new StringBuilder();
int accum = 0;
int count = 0;

for (char c : base64EncodedString.toCharArray()) {
        accum = (accum << 6) | base64Mapping[c];
        count++;
        if (count == 4) {
            result.append((char) (accum >> 16));
            result.append((char) ((accum >> 8) & 0xFF));
            result.append((char) (accum & 0xFF));
            accum = 0;
            count = 0;
        }
}

 

๋””์ฝ”๋”ฉ์„ ํ•˜๋ ค๋ฉด ๋‹น์—ฐํžˆ ๋Œ€์น˜ํ‘œ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค. base64Chars๋ฅผ base64Mapping์œผ๋กœ ๋„ฃ๋Š”๊ฒŒ ํ‘œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ž‘์—…์ด๋‹ค. Base64์—์„œ = ๋Š” ๋์„ ์•Œ๋ ค์ฃผ๋Š” ๋ฌธ์ž์ธ๋ฐ ์ด๊ฑด ๊ณ ๋ คํ•˜์ง€์•Š์•˜๋‹ค. ๋”ฐ๋ผ์„œ ํŒจ๋”ฉ๋„ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์ด๋ฏ€๋กœ ์ˆœ์ˆ˜ ๊ตฌํ˜„๋งŒ ๋ณด๋„๋ก ํ•˜์ž.

Text content M a n
ASCII 77 97 110
Bit pattern 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
Index 19 22 5 46
Base64-Encoded T W F u

 

์ธ์ฝ”๋”ฉ ๊ณผ์ •์ด๋‹ค. ASCII๋กœ ๋ณ€ํ™˜ํ•œ ๋ฌธ์ž์—ด์„ 8bit๋กœ ๋ฐ”๊พผ๋‹ค์Œ, 6๋น„ํŠธ๋กœ ๋Š์–ด์„œ ํ‘œ์— ๋„ฃ์–ด ๋Œ๋ฆฐ๋‹ค.(์œ„์—์„œ ํฌ๊ธฐ 64์งœ๋ฆฌ ๋ฐฐ์—ด)

๊ทธ๋Ÿผ ๋””์ฝ”๋”ฉ ๊ณผ์ •์€ ์—ญ์ˆœ์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด๋œ๋‹ค. accum << 6 | base64Mapping[c]๊ฐ€ ๊ทธ ์—ฐ์‚ฐ์ด๋‹ค.

 

count๋ฅผ ์“ฐ๋Š”๊ฑด 6*4 -> 8*3์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด๋œ๋‹ค. ์ฆ‰ 24bit์งœ๋ฆฌ ๋ฒ„ํผ๋ฅผ ํ•˜๋‚˜ ์‚ฌ์šฉํ•˜๋Š” ๋น„ํŠธ์—ฐ์‚ฐ์ด๋‹ค.

  1. count๊ฐ€ 4๊ฐ€ ๋๋‹ค๋Š”๊ฑด accum์— 24๋น„ํŠธ๊ฐ€ ์ฐจ์žˆ๋‹ค๋Š” ๋ง
  2. accum์˜ ์ƒ์œ„ 8bit๋ฅผ char๋กœ ๋ฐ”๊ฟ”์„œ ์ถ”๊ฐ€
  3. ๊ทธ๋‹ค์Œ 8bit์„ char๋กœ ๋ฐ”๊ฟ”์„œ ์ถ”๊ฐ€, & 0xFF๋Š” 64bit 2์ง„ํ‘œ์‹œ๋กœ 0000000011111111์ธ๋ฐ AND์—ฐ์‚ฐ์„ ํ†ตํ•ด 8bit๋กœ ์ค„์—ฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  4. ๋‚จ์€ accum 8bit๋„ ์ฒ˜๋ฆฌํ•ด์คฌ์œผ๋ฉด, accum, count์— 0์„ ๋„ฃ์–ด ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

์ด ๊ณผ์ •์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ด๋‹ค๋ฉด

import java.util.Base64;

String input = sc.nextLine();
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedBytes = decoder.decode(input);
String decodedString = new String(decodedBytes, "UTF-8");

 

๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ต์ˆ™ํ•˜์ง€์•Š์€ Base64.Decoder ์ด ๋ถ€๋ถ„์„ ๊ธฐ์–ตํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ํ‘œ์— ๋Œ€์‘ํ•˜๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ค ํ•„์š”๋„ ์—†๊ณ  ๋‚˜๋จธ์ง€ ์ž‘์—…๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹ค ์•Œ์•„์„œ ํ•ด์ค€๋‹ค.

 

์ถœ์ฒ˜: https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464
๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^

 

๋ฐ˜์‘ํ˜•
COMMENT