做了六七年的程序员,经常用到Base64编码,但是一直没搞明白为什么用,原理。最近在一本书上看到了Base64的编码原理,原来这么简单。Base64解决了什么问题?如果我们要在网络中传输以下问题:你好,小子,我是砖头,你是谁?此文本包含不可见字符,例如空格、换行符和回车符。在网络传输过程中,各设备对不可见字符的处理机制可能不同,可能会出现信息传输错误。这时我们就需要一种编码机制,将所有不可见的字符都转换成可见的字符。Base64编码原理接下来我们通过将单词abcd转成Base64编码来理解它的原理。将字符分成三组或三组,不够用0补上。比如abc三个字符组合在一起,d不够三位,就补0到d00。将字符转换为二进制ASCII编码。每六位分隔转换后的二进制文件。Q:为什么第一步要分三个字为一组?A:因为ASCII码的每个字符都是8位二进制,3*8=24。通过第三步可以拆分成4个6位二进制,4*6=24。6位二进制可以表示0-63。我们有一个彩虹表,它可以对应一个从0-63的字符。彩虹表如下:通过彩虹表,我们可以转换每6位除法后的二进制。需要注意的是,padding产生的任何0都需要用=来表示。所以最后两位数都是=。最后将abcd转Base64,编码为YWJjZA==。总体原理比较简单,不涉及高级算法。Base64外设无法在URL中正常传输,因为Base64转码后会包含+/=字符。因此,存在一种URL友好的Base64编码,它使用_-而不是+/并且不在末尾附加=。Base32和Base16的原理与Base64基本相同。Base64不适合加密,因为解密太简单了。汉字经过gb2312、utf-8、gbk编码后,可以转换成二进制处理。下面是网上的一张图片的解释:Base58和Base58CheckBase58是比特币在生成钱包地址时使用的一种编码形式。它与Base64的主要区别在于去除了字符0(零)、O(大写O)、I(大写i)、l(小写L)和几个影响双击选择的字符:/这样做的目的code和+比较简单,就是防止转账的时候看错账号,转错账号。Base58的原理比较简单,只涉及十六进制的转换,大致步骤如下:将字符转换为ASCII码,将ASCII码转换为58十六进制,通过彩虹表映射。比如abcd转换:converttoASCIIcode97-98-99-100通过下面的彩虹表转换成58进制3-28-21-49-5-22映射到3VNr6PBase58校验码,顾名思义,Base58可以检查代码。比如我在传输qH912cvztx代码的时候,如果由于网络异常等各种原因造成数据损坏或者丢失,那么接收方必须能够识别出数据有问题。Base58Check编码的基本原理是:在数据前加一个版本标识前缀来标识编码后的数据类型,比如比特币地址的前缀是0(十六进制为0x00)。通过哈希算法计算前缀+数据的哈希值:SHA256(前缀+数据)。将生成的哈希值截断为前四位,拼接成如下前缀+数据+4位哈希。将上一步生成的结果进行Base58编码计算,得到最终结果。
