作者:林冠宏 / 指尖下的幽灵

博客:http://www.cnblogs.com/linguanh/

GitHub : https://github.com/af913337456/

腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities

虫洞区块链专栏:https://www.chongdongshequ.com/article/1536563643883.html

掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8


PS: 本文目的,通俗简短地介绍一次 base 类编码方式,然后让你记住。

目录

  • 前言
  • 编码流程
  • 自定义表格
  • 总结

前言

相信超过绝大多少的程序员都曾在各种的软件开发中使用过编码、解码,编码和解码是对应的,有编码就有解码。

base16,base32,base64 都是编码方式,对应有各自的一套编码算法。

但是有人经常称它们是加密,例如 base64 加密。其实这种说法不算全对。因为默认的 base16,base32,base64 的各种信息都是公开的,公开的包含有:

  • 算法的运算方式
  • 编码表格,这个是主要

在 base16,base32,base64 中,一旦掌握了上面两类信息,那么就相当于破解了。甚至可以手动用笔写出编码后的结果以及根据编码结果写出解码内容。


16,32和64它们编码原理都是一样的,不同的地方在于下面 2 东西:

  1. 一个字符所对应表格中的下标的 bit 位是多少个
  2. 对应的编码表格是多少

上述两点是什么意思呢?

首先我们知道数据类型 char 一般占2个字节,当然还有二般的情况,比如1个字节,但这里我们以2字节为例,例如: char r = 'a',那么如果这种规则被修改了呢,既然可以使用2个字节表示一个字符,那么为什么不可以用3字节,5字节表示?当我们其它的字节个数表示一个字符的时候,就会产生其它效果。而,上述的第一点就是类似这个意思。当代表下标的 bit 位的个数变了,下标的取值范围也跟着变,比如 2 个 bit 位最大的数是 11 = 3,而 3 个 bit 位最大的数是 111 = 7 。

对于第二点来说,就是一个用来供查表的表格,例如9x9乘法表。这个表格是要被查询的。

编码流程

当有了上述两点的条件后,我们将编码的流程总结为下面几点:

例如要被编码的字符串是:ILU

  1. ILU 字符串中的每个字符转为对应于 Ascii 编码表的值,I = 73, L = 76, U = 85。

  2. 将第一步中的 Ascii 值分别转为对应的二进制格式,要求必须是形成8 个 bit,不足8比特位高位补0。例如:1 的二进制是 1,明显不够8位,最终应该显示为:0000 0001ILU 的转化结果如下:

    73 = 01001001

    76 = 01001100

    85 = 01010101

  3. 根据base X(这里的 X 代表 16,32,64等编号) 编码算法中所指定的y 个 bit 位为一个字符在表格中的下标 的规则,对第2步的进行划分。例如 base 16的规则要求,4位作为一个下标对应一个字符,即每4个位为一部分,故划分如下:

    第1部分:0100 是 (73 = 01001001,的前4个位)

    第2部分:1001 是 (73 = 01001001,的后4个位)

    第3部分:0100

    第4部分:1100

    第5部分:0101

    第6部分:0101

  4. 将第三步中划分出的每个部分进行10进制转换,得出对应于10进制数的下标值,如下:

    0100 = 4,1001 = 9,4,12,5,5

  5. 最后一步,将第4步中得出的下标数查表,得出对应的字符,连在一起,就是编码结果

    base16 的默认编码表字符串是:数字0~9字母A~F,共16个,将每个的下标和值列表格,如下所示:

    base16 的编码表

    下标 编码值 下标 编码值
    0 0 8 8
    1 1 9 9
    2 2 10 A
    3 3 11 B
    4 4 12 C
    5 5 13 D
    6 6 14 E
    7 7 15 F

    最终 ILUbase16 编码结果是:494C55

自定义表格

代码中,我们可以指定自己的编码表,例如下面的一行:

var encoding = base32.NewEncoding("ybndrfg8ejkmcpqxot1uwisza345h769")

ybndrfg8ejkmcpqxot1uwisza345h769 是 32 个字符,对应 base 32 编码,下标 0 对应的字符是 y

当上面的 ILU 例子用 该表格编码时,那么就不再是: 494C55

总结

在上面的第3步,对于刚好能够整数划分的 (8 / 4 = 2 整除),是不会有出现在最终结果后面补充等于号"="符号的情况的,而不能除尽的,将会被补充为 "=" 。下面是 16,32和64的需要bit位个数和编码表的总字符

名称 下标数字的位个数 编码表字符串 位数不足是否会补全 =
base 16 4 数字0~9 和 字母 A~F 不会,位数刚好是 4 的倍数
base 32 5 大写字母A~Z 和 数字2~7
base 64 6 大写字母AZ,小写字母az,数字0~9以及"+","/"
名称 编码后,数据量变化
base 16 由一个8位表示一个字符 变成 4位表示一个字符,数据量变 2 倍
base 32 变为 8/5 倍
base 64 变为 8/6=4/3 倍

补全的限制,拿base32 来说,因为每5位表示一个字符下标值,而原始数据是8位,这就意味着,划分会出现剩下的情况,例如:

8 - 5 = 3,明显有3个 bit 位剩下,那么至少要多少个位才能满足步出现剩下的呢?这是一个最小公倍数问题,就是: 5*8 = 40 位。我们可以验证一下,当两个字符的时候,是16位,16/5 = 1,以此类推。

最终,得出在 base32 的编码中,待编码数据至少要 >= 40 位,其最终的编码结果才能不出现 = 号。例如要被编码的字符是3,很明显,它的结果是:D=======,后面的 = 都是补全的。

同理,base64 的是至少 24 位,24 是 6 和 8 的最小公倍数。

上述,就是所有内容,记住此类编码方式的主要点:

  1. 一个字符所对应表格中的下标的 bit 位是多少个
  2. 对应的编码表格是多少

剩下的,就是照着模式走,划分、对表,得出结果。

广告时间

我的由清华大学出版社出版的区块链纯技术书籍:

《区块链以太坊DApp开发实战》

现已出版并可网购。

适合区块链初中级工程师阅读。

base16,base32,base64 编码方式的通俗讲解的更多相关文章

  1. Base系列编码浅析【base16 base32 base64 base85 base36 base 58 base91 base 92 base62】

    Base系列编码浅析 [base16   base32   base64   base85  base36  base 58  base91  base 92   base62]     base编码 ...

  2. base64编码方式

    一.编码的两大方式: 在python3.x中,字符串编码分为unicode和bytes两大类编码方式. 直接书写s='中国人',这种方式定义的编码方式为unicode,是通用的方式. 另一种是byte ...

  3. iOS 中使用Base64编码方式编码图片数据

    最近一个项目要求对图片数据简单加密下,就是那种不能直接看到图片内容就行.于是我使用了base64编码对图片数据进行编码,把图片2进制数据变成了base64的字符串,再把这个字符串保存到server的数 ...

  4. 计算机编码规则之:Base64编码

    目录 简介 Base64和它的编码原理 Base64的变体 Base64的编码细节 总结 简介 我们知道计算机中的文件可以分为两种,一种是人肉眼可读的文本类文件,一种是肉眼不可读的二进制文件.一般来说 ...

  5. SSE图像算法优化系列三十一:Base64编码和解码算法的指令集优化。

        一.基础原理 Base64是一种用64个Ascii字符来表示任意二进制数据的方法.主要用于将不可打印的字符转换成可打印字符,或者简单的说是将二进制数据编码成Ascii字符.Base64也是网络 ...

  6. 浅谈Base64编码

    浅谈Base64编码 我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了.如果您对二进制数有所了解,你就可以开始读它了. 打开一封Emai ...

  7. 媒体文件audio 转 base64 编码 (利用 FileReader & Audio 对象)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示

    Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示 在 开发中遇到应用c#及asp.net的在的webservice 保存图片并以xml文件形式现实出来 ...

  9. java 自定义实现base64编码转换

    1.base64编码转换 所谓base64编码,即按照规则把字符转化为"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456 ...

随机推荐

  1. miniui autocomplete支持放大镜按钮(data-grid)

    <style type="text/css"> html body .searchbox .mini-buttonedit-close { background:url ...

  2. 零元学Expression Blend 4 - Chapter 10 用实例了解布局容器系列-「StackPanel」

    原文:零元学Expression Blend 4 - Chapter 10 用实例了解布局容器系列-「StackPanel」 本系列将教大家以实做案例认识Blend 4 的布局容器,此章介绍的布局容器 ...

  3. 【转】ORACLE AWR报告

    转自:http://blog.csdn.net/liqfyiyi/article/details/8236864 About Oracle AWR Oracle AWR is a powerful m ...

  4. Ubuntu Linux服务器搭建SSL/TLS(https)(在StartSSL可以得到免费证书)

    目录 1 生成公钥和私钥对 2 公钥提交到CA机构签发一个crt证书 3 配置证书链 4 在Apache里开启SSL支持并配置crt证书和私钥 5 配置HSTS (可选) 6 总结 首先SSL/TLS ...

  5. Qt系统对话框中文化及应用程序实现重启及使用QSS样式表文件及使用程序启动界面

    一.应用程序中文化 1).Qt安装目录下有一个目录translations/,在此目录下有qt_zh_CN.ts和 qt_zh_CN.qm把它们拷贝到你的工程目录下. 2).在main函数加入下列代码 ...

  6. PC-lint 简明教程(C/C++静态代码检查工具)

    前言 PC-lint是一款小而强大的C/C++静态代码检查工具,它可以检查未初始化变量,数组越界,空指针等编译器很难发现的潜在错误.在很多专业的软件公司如Microsoft,PC-Lint检查无错误无 ...

  7. 原生Js封装的产品图片360度展示

    挺简单的一段程序,但是效果不错: 1.把需要展示的36张图片先预加载到浏览器缓存里 2.给展示图片的div添加方法 3.通过鼠标左右移动的像素转换图片 在线效果预览:http://jsfiddle.n ...

  8. IIS 站点和应用池命令启动和停止

    在CMD下执行如下命令: IIS站点: 停止站点: C:\Windows\System32\inetsrv\appcmd.exe stop site “XXXX” 启动站点: C:\Windows\S ...

  9. Tido 习题-二叉树-树状数组求逆序对

    这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述   样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示     #include<iostream ...

  10. 10 jQuery的事件绑定和解绑

    1.绑定事件 语法: bind(type,data,fn) 描述:为每一个匹配元素的特定事件(像click)绑定一个事件处理器函数. 参数解释: type (String) : 事件类型 data ( ...