base64.b64encode(s[,altchars]):使用Base64编码字符串。s是要编码的字符串。altchars是用来替换+和/的字符串,在url和文件系统中它们有特殊含义,通常需要替换。
base64.b64decode(s[,altchars]): 解码Base64编码的字符串。s为要解码的字符串。altchars和b64encode相同。
不晓得楼主清不清楚base32编码原理啊,其实还是蛮简单的。 base32和base64原理是一样的,32和64分别是2^5和2^6。
拿base32举例来说,每一个字符是有5Bit,但是ASCII字符有8Bit,所以base32是用8个base32字符来代替5个ASCII字符。
同样,base64是用4个base64字符代替3个ASCII字符。这样的话,进行对应的转码就只要取出对应位数的字符进行简单的位运算,不足位补零就可以了。
作
遇到一个与地址相关的问题:新生成的合约地址本质上与其它地址一样,都是 32 字节的 byte 数组;但是,当试图将地址转化为适合人类阅读的字符串时,转换出的结果却是乱码。
每个字节是通过 8 位二进制数来表示的,这 8 位二进制数具体表示的 256 种可能的字符在 ASCII 码中给出了明确的定义。
问题就在于这 256 种字符中只有一部分是我们平时理解中的字符:
因此,将地址转化为字符串显示时,超出以上范围的值显示的就只能是我们所不能理解的形式了,即乱码。
既然显示乱码是因为 ASCII 码超出了所需的范围,那么就可以通过某种编码方式,将二进制数值进行编码,使其落到能够正常显示的区间内就可以了。
而编码方式的具体实现,早就有人已经做好了,我们不再需要重复造轮子,拿过来直接使用即可。
具体的实现有 Base 编码系列:Base64、Base32、Base16。
这里采用的是 Base32 编码:
其特点有:
那么来实践一下:
得到的结果是 56 字节的 byte 数组,超出了我们需要的 32 字节的长度,为什么会这样呢?
仔细看一下 Base32 编码的原理:
在这个编码的过程中无疑会放大字节数组的长度,经过计算,32 字节的 byte 数组被放大为了 56 字节的 byte 数组;而如果要求最终的结果为 32 字节的 byte 数组的话,要求输入值为 20 字节的 byte 数组!
获得 20 字节的 byte 数组的方式很简单:
我们选择的是第二种方式,理由是:经过哈希运算产生的结果很难出现重复,而截取的话就不能保证了。
对结果进行验证:
如此,就得到了我们所需的能够正常显示的字符串地址了。
base32/base64是一种常用的加密方式,拿到base64的密文后,我们虽然可以在某些网站上解码。但在没网络下的情况,我们可以运用Python进行base32/base64解码,以下是python的
Base32包含26个大写字母和2-7的数字。
base64.b32en(s):使用Base32编码字符串s是要编码的字符串base64.b32decode(s[,casefold[,map01]]),解码Base32编码的字符串s为要解码的字符串casefold表示是否允许小写字母map01表示允许0表示0,1表示L。
base32是一种常用的加密方式,拿到base32的密文后,我们虽然可以在某些网站上解码但在没网络下的情况,我们可以运用python进行base32解码,以下是python的代码。
启动WINDWOS附件中的计算器,点“查看”,点“科学型”,选中左上边的“十进制”,用鼠标点击输入“32”,再选中上面的“十六进制”,得出的结果是“20”。 以此类推,可以用这个方法计算所有换算