base16,base32,base64 编码方式的通俗讲解
作者:林冠宏 / 指尖下的幽灵
GitHub : https://github.com/af913337456/
腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities
虫洞区块链专栏:https://www.chongdongshequ.com/article/1536563643883.html
PS: 本文目的,通俗简短地介绍一次 base 类编码方式,然后让你记住。
目录
- 前言
- 编码流程
- 自定义表格
- 总结
前言
相信超过绝大多少的程序员都曾在各种的软件开发中使用过编码、解码,编码和解码是对应的,有编码就有解码。
base16,base32,base64 都是编码方式,对应有各自的一套编码算法。
但是有人经常称它们是加密
,例如 base64 加密。其实这种说法不算全对。因为默认的
base16,base32,base64 的各种信息都是公开的,公开的包含有:
- 算法的运算方式
- 编码表格,
这个是主要
在 base16,base32,base64 中,一旦掌握了上面两类信息,那么就相当于破解了。甚至可以手动用笔写出编码后的结果以及根据编码结果写出解码内容。
16,32和64它们编码原理
都是一样的,不同的地方在于下面 2 东西:
一个字符所对应表格中的下标的 bit 位是多少个
- 对应的
编码表格
是多少
上述两点是什么意思呢?
首先我们知道数据类型 char
一般占2个字节,当然还有二般的情况,比如1个字节,但这里我们以2字节为例,例如: char r = 'a'
,那么如果这种规则被修改了呢,既然可以使用2个字节表示一个字符,那么为什么不可以用3字节,5字节表示?当我们其它的字节个数表示一个字符的时候,就会产生其它效果。而,上述的第一点就是类似这个意思。当代表下标的 bit 位的个数变了,下标的取值范围也跟着变,比如 2 个 bit 位最大的数是 11
= 3,而 3 个 bit 位最大的数是 111
= 7 。
对于第二点来说,就是一个用来供查表的表格,例如9x9乘法表
。这个表格是要被查询的。
编码流程
当有了上述两点的条件后,我们将编码的流程
总结为下面几点:
例如要被编码的字符串是:ILU
将
ILU
字符串中的每个字符转为对应于Ascii
编码表的值,I = 73, L = 76, U = 85。将第一步中的
Ascii
值分别转为对应的二进制
格式,要求必须是形成8 个 bit
,不足8比特位高位补0。例如:1 的二进制是 1,明显不够8位,最终应该显示为:0000 0001
。ILU
的转化结果如下:73 = 01001001
76 = 01001100
85 = 01010101
根据
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
将第三步中划分出的
每个部分
进行10进制转换
,得出对应于10进制数的下标值
,如下:0100 = 4,1001 = 9,4,12,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 最终
ILU
的base16
编码结果是: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 的最小公倍数。
上述,就是所有内容,记住此类编码方式的主要点:
- 一个字符所对应表格中的下标的 bit 位是多少个
- 对应的编码表格是多少
剩下的,就是照着模式走,划分、对表,得出结果。
广告时间
我的由清华大学出版社出版的区块链纯技术书籍:
《区块链以太坊DApp开发实战》
现已出版并可网购。
适合区块链初中级工程师阅读。
完
base16,base32,base64 编码方式的通俗讲解的更多相关文章
- 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编码 ...
- base64编码方式
一.编码的两大方式: 在python3.x中,字符串编码分为unicode和bytes两大类编码方式. 直接书写s='中国人',这种方式定义的编码方式为unicode,是通用的方式. 另一种是byte ...
- iOS 中使用Base64编码方式编码图片数据
最近一个项目要求对图片数据简单加密下,就是那种不能直接看到图片内容就行.于是我使用了base64编码对图片数据进行编码,把图片2进制数据变成了base64的字符串,再把这个字符串保存到server的数 ...
- 计算机编码规则之:Base64编码
目录 简介 Base64和它的编码原理 Base64的变体 Base64的编码细节 总结 简介 我们知道计算机中的文件可以分为两种,一种是人肉眼可读的文本类文件,一种是肉眼不可读的二进制文件.一般来说 ...
- SSE图像算法优化系列三十一:Base64编码和解码算法的指令集优化。
一.基础原理 Base64是一种用64个Ascii字符来表示任意二进制数据的方法.主要用于将不可打印的字符转换成可打印字符,或者简单的说是将二进制数据编码成Ascii字符.Base64也是网络 ...
- 浅谈Base64编码
浅谈Base64编码 我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了.如果您对二进制数有所了解,你就可以开始读它了. 打开一封Emai ...
- 媒体文件audio 转 base64 编码 (利用 FileReader & Audio 对象)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示
Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示 在 开发中遇到应用c#及asp.net的在的webservice 保存图片并以xml文件形式现实出来 ...
- java 自定义实现base64编码转换
1.base64编码转换 所谓base64编码,即按照规则把字符转化为"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456 ...
随机推荐
- ${FUNCNAME[@]}和$LINENO使用
$LINENO代表shell脚本的当前行号 [root@mysql-B ~]# cat test1.sh #!/bin/bash trap 'echo “before execute line:$LI ...
- isHiden和isVisible的区别(可是有nativeEvent进行设置)
之前一直对isHiden和isVisible的区别比较模糊,都是乱用的.今天因需要仔细看了一下. 1.isHiden只是返回部件的隐藏属性,并不能表示部件当前的真实状态.比如A部件有个子部件B,而A处 ...
- layui打印表格自定义函数
函数如下 function print (tablelayid) { var v = document.createElement("div"); var f = ["& ...
- 如何在 Xcode 中进行 Qt 开发(可使用使用 Homebrew 来安装qt)
第一步 安装 Qt 分为两种情况: 1. 希望使用 Qt Quick 等先进Qt5技术, 2. 只需要 Qt 4.8的类库即可. 第一种, 直接去官网下载 Mac安装包, 在此不作过多说明, 开发时也 ...
- 浅谈网络爬虫爬js动态加载网页(一)
由于别的项目组在做舆情的预言项目,我手头正好没有什么项目,突然心血来潮想研究一下爬虫.分析的简单原型.网上查查这方面的资料还真是多,眼睛都看花了.搜了搜对于我这种新手来说,想做一个简单的爬虫程序,所以 ...
- 每日一问:到底为什么属性动画后 View 在新位置还能响应事件
在 Android 开发中,我们难免会使用动画来处理各种各样的动画效果,以满足 UI 的高逼格设计.对于比较复杂的动画效果,我们通常会采用著名的开源库:lottie-android,或许你会对 lot ...
- 使用 Cake 推送 NuGet 包到 AzureDevops 的 Artifacts 上
前言 大家好,我最近在想如何提交代码的时候自动的打包 NuGet 然后发布到 AzureDevOps 中的 Artifacts,在这个过程中踩了很多坑,也走了很多弯路,所以这次篇文章就是将我探索的结果 ...
- 【LEETCODE】32、LeetCode的第35题,查找插入的位置
凉凉,看来想做好一个题还不容易啊... 有点难受... 1.看看题目吧 Given a sorted array and a target value, return the index if the ...
- pytorch实现yolov3(3) 实现forward
之前的文章里https://www.cnblogs.com/sdu20112013/p/11099244.html实现了网络的各个layer. 本篇来实现网络的forward的过程. 定义网络 cla ...
- iOS App开发的那些事儿2:如何搭建合适的框架
<iOS App开发的那些事儿>系列文章从更宏观的角度出发,不仅仅局限于具体某个功能.界面的实现,而是结合网易云信iOS端研发负责人多年的经验,从如何优化现有代码的角度出发,深度分析如何创 ...