本文已参与「新人创作礼」活动,一起开启掘金创作之路。
之前有个面试有问到,见本博客系列《花旗面经.md》
Base64
Base64是一种用64个可打印字符来表示任意二进制数据的方法。
用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。
哪些字符入选base64?
-
A-Z a-z 这样就26*2=52个
-
10个数字,这样就62个了,加上
-
+和/(也有用-,_url safe)
然后,对二进制数据进行处理,每3个字节一组,一共是3x8=24bit,划为4组,每组正好6个bit(2的6次方是64,这就是Base64得名的原因):
这样我们得到4个数字作为索引,然后查表,获得相应的4个字符,就是编码后的字符串。
所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。
如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。
Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
Base58
base58是Base64的一个变种,主要用于数字货币比特币btc中使用的一种特殊的编码方式,主要用于生成钱包地址。主要目的是防止人类误读
----不使用数字0和字母大写O,以及字母大写I和字母小写l。
----不使用"+"和"/"。
-----没有标点符号,通常不会被从中间分行。
-----支持双击选择整个字符串,便于拷贝。
Base58 的输入是一个[0,256)的值的流,输出结果是一个[0,58) 的值的流。然后将每个值去查字母表,得出一个可视字符串。转换过程实际上就是一个256进制的值转换为一个58进制的值。