Base16, Base64, Base58, Base32

如果不需要人眼查看,按照字节传递是长度最少的。

为了将二进制内容用字符表现出来,方便人类使用,有各种标准规范。

最简单的一种叫做HEX,也就是Base16表示法。 一个2进制表示称为 bit,就是0或者1。8个bit称为一个byte, 类似 11011001, 一个byte可以表示两个16进制数。上面的数字转换为16进制就是 D9

计算机中都使用byte作为基本单位,所有的文件按字节的16进制表示。这就是HEX表示法. 使用字符范围是 0-9A-F,每个字节用两个字符表示,文字数量长度比二进制多一倍。 https://zh.wikipedia.org/wiki/%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6 (opens new window)

Base64是一个减少编码长度的选择 Base64使用了64个字符来表示2进制。使用字符范围是 0-9A-Za-z,一共62个,外加上 加号+和斜杠/,共64个字符,另外使用等号=用来作为后缀。 Base64用 6个bit作为一个单元对应某个字符。这样3个byte相当于24bit,对应4个base64字符 编码的时候每3个byte一组进行编码。编码后长度比二进制多8/6=1.33倍。 https://zh.wikipedia.org/wiki/Base64 (opens new window)

但是Base64的编码结果并不适合人去检查,里面包含易混淆的数字"0",字母大写"O",字母大写"I",和字母小写"l”,还包含"+"和"/"符号。

在比特币中去掉了Base64中易混淆的6个字符,变成了Base58。 Base58无法像Base64那样转换为8bits的2进制后依次取出6bits就可以快速完成转换。因此,Base58编码算法需要除法运算实现,如果被编码的数据较长,则要用特殊的类来处理大数。编码后长度比二进制多8/5.858=1.37倍。

以下引用自其作者Satoshi Nakamoto在base58.h中的注释:

//
// Why base-58 instead of standard base-64 encoding?
// - Don't want 0OIl characters that look the same in some fonts and
//      could be used to create visually identical looking account numbers.
// - A string with non-alphanumeric characters is not as easily accepted as an account number.
// - E-mail usually won't line-break if there's no punctuation to break at.
// - Doubleclicking selects the whole number as one word if it's all alphanumeric.
//

https://zh.wikipedia.org/wiki/Base58 (opens new window)

Base32使用32个字符A-Z2-7来表示。每5个bit表示一个字符。用Base32可以解决Base64中的易混淆字符问题,同时其中没有小写字符,没有加号+和斜杠/这种特殊字符,编码结果可以直接用于URL,用于文件名。在比特币笔记Note.SV中,我们使用Base32处理OTP(One Time Password),在很多现代化的网站,金融机构,比特币交易所都有使用二次验证的OTP。 编码后长度比二进制多8/5=1.6倍。 https://en.wikipedia.org/wiki/Base32 (opens new window)

拥抱比特币带来的新世界,使用 Note.SV (opens new window)