编程题:Base64编码(base64_encode)
想出些用二进制数据作为输入的题目,但是二进制数据不容易编写和比对,而URL编码密度太低(可能膨胀三倍)。对此类问题,业界已有成熟的解决方案:**Base64编码**。
研读Base64编码的维基百科后发现:它居然有好几种变种。为了提高适用性,我们实现通用的Base64编码方案:
- ASCII字符集避开控制字符(包括DEL)和空格后,从!(编码33)到~(编码126)是可见并且能直接输入的字符,共有94个。
- 鉴于64 < 94 < 128,这些可见字符表示6-bit绰绰有余。
- 从中选64个字符当作64进制的数字,每个字符能表示6-bit数据,从0到63。
- 例如:0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_~,共10 + 26 + 26 + 2个。
- 于是任意3字节的数据可用4个Base64字符来表示(3 * 8 = 24-bit = 4 * 6)。
- 当数据长度不是3的整倍数时,3字节组在**转换前**要视情况补充8-bit或16-bit的0,并在**转换后**的字符串追加1或2个**填充标记**。
- 对于三字节数据的排列,有两种方式:
- 小端序:从低字节向高字节排列,不足时高位补0。
- 大端序:从高字节向低字节排列,不足时低位补0。
先导题目:《URL解码(url_decode)》,输入是用URL编码的数据。
目的:练习C++字符串处理、位运算、函数指针;加深对字节序的理解、了解Web常识、掌握二进制数据编码方案。
#### 输入规格
- 首行由两个字符串构成,第一个串是BE或LE。第二个串有65个字符,前64个用于编码,第65个作为**填充标记**。
- 之后每行一组URL编码的数据,请用先导题目《URL解码(url_decode)》获取原始的二进制串,然后用首行给出的字符集和模式进行Base64编码。
- 数据可用string保存。本题不考察时空复杂度。
#### 输出规格
- 每行输出一个Base64编码后的字符串。
#### 样例输入
in
BE ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
hello%2C%20world
A
AB
ABC
%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF
#### 样例输出
out
aGVsbG8sIHdvcmxk
QQ==
QUI=
QUJD
AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==
#### 样例解释
- 首行:BE大端填充模式。标准的Base64字符集。
- 第2行:URL解码后的原文是hello, world,共12字节。
- 第3行:共1字节,2字符填充标记(==)。
- 第4行:共2字节,1字符填充标记(=)。
- 第5行:共3字节,无需填充。
- 第6行:共256字节,从0到255。URL编码后637字符,增长了150%。而Base64编码345字节,只增加35%。这是Base64编码的优点。
答案:若无答案欢迎评论
研读Base64编码的维基百科后发现:它居然有好几种变种。为了提高适用性,我们实现通用的Base64编码方案:
- ASCII字符集避开控制字符(包括DEL)和空格后,从!(编码33)到~(编码126)是可见并且能直接输入的字符,共有94个。
- 鉴于64 < 94 < 128,这些可见字符表示6-bit绰绰有余。
- 从中选64个字符当作64进制的数字,每个字符能表示6-bit数据,从0到63。
- 例如:0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_~,共10 + 26 + 26 + 2个。
- 于是任意3字节的数据可用4个Base64字符来表示(3 * 8 = 24-bit = 4 * 6)。
- 当数据长度不是3的整倍数时,3字节组在**转换前**要视情况补充8-bit或16-bit的0,并在**转换后**的字符串追加1或2个**填充标记**。
- 对于三字节数据的排列,有两种方式:
- 小端序:从低字节向高字节排列,不足时高位补0。
- 大端序:从高字节向低字节排列,不足时低位补0。
先导题目:《URL解码(url_decode)》,输入是用URL编码的数据。
目的:练习C++字符串处理、位运算、函数指针;加深对字节序的理解、了解Web常识、掌握二进制数据编码方案。
#### 输入规格
- 首行由两个字符串构成,第一个串是BE或LE。第二个串有65个字符,前64个用于编码,第65个作为**填充标记**。
- 之后每行一组URL编码的数据,请用先导题目《URL解码(url_decode)》获取原始的二进制串,然后用首行给出的字符集和模式进行Base64编码。
- 数据可用string保存。本题不考察时空复杂度。
#### 输出规格
- 每行输出一个Base64编码后的字符串。
#### 样例输入
in
BE ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
hello%2C%20world
A
AB
ABC
%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF
#### 样例输出
out
aGVsbG8sIHdvcmxk
QQ==
QUI=
QUJD
AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==
#### 样例解释
- 首行:BE大端填充模式。标准的Base64字符集。
- 第2行:URL解码后的原文是hello, world,共12字节。
- 第3行:共1字节,2字符填充标记(==)。
- 第4行:共2字节,1字符填充标记(=)。
- 第5行:共3字节,无需填充。
- 第6行:共256字节,从0到255。URL编码后637字符,增长了150%。而Base64编码345字节,只增加35%。这是Base64编码的优点。
答案:若无答案欢迎评论