base64如何转换其字符列表中不存在的字符?

时间:2016-12-08 10:36:51

标签: php encryption encoding utf-8 base64

我有一个脚本,每次都会使用随机编码生成加密文本。要使用utf-8编码将加密文本保存在数据库中,我将加密文本转换为base64编码。我认为它转换正确,生成的字符串可能像( ÷§úAû‰ñÁyˆÚªÌE)

虽然加密文本包含base64编码字符集(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)中不存在的字符,但base64编码如何转换奇怪的加密文本?

作为base64编码字符列表的参考,这里是关联的RFC

1 个答案:

答案 0 :(得分:1)

Base64用于将任何二进制数据编码为有效的ASCII。你编码的数据 not 必须是Base64字符集(这会使整个操作变得毫无用处)。

Base64简单地将二进制数据字节用于字节 1 ,并将这些位映射为其字符的组合。因此,输入没有其他要求,而是由字节组成。

÷§úAû‰ñÁyˆÚªÌE的情况下,它会像这样转换:

你说输入是UTF-8 2 ,所以字节是C3 B7 C2 A7 C3 BA 41 C3 BB E2 80 B0 C3 B1 C3 81 79 CB 86 C3 9A C2 AA C3 8C 45(UTF-8中的÷§úAû‰ñÁyˆÚªÌE)。

所以取前三个字节(C3 B7 C2)并映射它们:

Byte   | C3              | B7              | C2              |
Bits   | 1 1 0 0 0 0 1 1 | 1 0 1 1 0 1 1 1 | 1 1 0 0 0 0 1 0 |
Index  | 48         | 59          | 31          | 2          |
Base64 | w          | 7           | f           | C          |

因此前四个字符是w7fC。然后只重复输入的其余部分(如果输入不是三个字节的倍数,那么一些填充完成,这里没有介绍)。

如您所见,输入可以是任何二进制数据。

1 Base64使用8位字节。

2 幸运的是,UTF-8使用8位代码单元。

您可以在Wikipedia上详细了解编码的完成方式。