[关闭]
@yang12138 2018-10-31T17:10:52.000000Z 字数 1331 阅读 1178

Base64

Base64 是一种常用的编码方式——可以把一个字符串编码成另一个看起来像乱码的字符串,当然也可以解码回去。

我们考虑一个字符串,对它进行 Base64 编码,过程如下。

先把字符串每三个字符分组,对于每一组:

  1. 按顺序写出该组的三个字符对应 ASCII 码的二进制(从高位到低位),得到 3*8=24 位的 0/1 串。
  2. 把这 24 位按每 6 位分成 4 段,每段分别转回十进制,得到了 4 个属于区间 [0, 63] 的数(显然)。
  3. 在 Base64 码表中查得这 4 个数对应的字符,依次写下。于是我们成功把这组的三个字符编码成了四个字符。

其中 Base64 码表(长 64,不包括首尾引号)如下:

  1. "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

举个例子,比如一组三个字符为 Man
- 它们对应的 ASCII 码为 77, 97, 110
- 分别转成二进制(一个字符 8 位,不够则高位补零)为 01001101, 01100001, 01101110
- 重新分组为 6*4 为 010011, 010110, 000101, 101110
- 再对应转回十进制 19, 22, 5, 46
- 查表(下标从 0 开始)第 19 位,第 22 位... 得到 TWFu,这组转换完毕。

对于比较长的字符串,我们每次取前三个字符进行上述转换,得到结果;继续向后取三个字符,重复处理。

如果恰好完毕,那编码结束。
如果还剩字符,那么在字符串末尾补 ASCII 为 0 的字符凑够 3 个,设补了 x 个(显然它必定为 1 或 2),
如上述过程处理完毕后,把结果的末 x 个字符变成 =

比如 Ma -> 77, 97, 0(补) -> 01001101 01000001 00000000 ->
010011 010110 000100 000000 -> 19, 22, 4, 0 -> TWEA -> TWE=

再比如 M -> 77, 0(补), 0(补) -> 01001001 00000000 00000000 ->
010011 010000 000000 000000 -> 19, 16, 0, 0 -> TQAA -> TQ==

注意上述补字符的操作之后发生在整个字符串的末尾,最多发生一次。

一个完整的例子,ManManMa 的编码结果是 TWFuTWFuTWE=

不过很不幸,你只有很多 Base64 编码后的字符串,你需要解码得到原始的字符串。

输入

若干行,每行一个非空字符串 S 为 Base64 编码后的字符串(保证合法),文末有且仅有一个换行。
数据范围见下。

输出

若干行,每行为答案(解码后的原始字符串),与输入顺序相对应。

文件尾有且仅有一个换行,所以你只需 在每次输出答案后 恰输出一个 换行 即可。

保证每行答案的长度属于区间 [1, 100000]

保证答案各行长度总和属于区间 [1, 100000]

数据保证每个答案所有字符的 ASCII 码属于区间 [32, 126],即“可显示字符”,
或者说,标准美式键盘上能直接打出来的字符(不包括换行,但包括空格)。

Example in

  1. cA==
  2. cHU=
  3. cHVt
  4. cHVtcA==
  5. cHVtcGs=
  6. cHVtcGtp
  7. cHVtcGtpbg==
  8. ZGVsaWNpb3VzIHB1bXBraW4=

Example out

  1. p
  2. pu
  3. pum
  4. pump
  5. pumpk
  6. pumpki
  7. pumpkin
  8. delicious pumpkin
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注