base64的实现原理
base64是处理二进制数据的一种编码方式,可用于把二进制数据编码成64个可打印的字符。
学习base64之前,先了解一下什么是字节与编码
什么是字节
互联网中的数据都是用字节来表示的,一个字节有8位二进制数据组成即00000000 -- 11111111
什么是编码
编码是把字符串转化成二进制数据的一种方式,计算机发展的过程中,最先定义了ASCII编码,用于表示英文字符和一些英文字符为128个字符;后来随着计算机被普及到各国ASCII的编码已经不能满足于显示各国语言的文字,所以说后面发展出了GBK、UNICODE 、UTF8、UTF16等不同类型的编码,在utf8编码中一个英文字符占用1个字节,一个中文字符占用3个字节
base64编码表
码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
base64的实现
base64是,64代表的就是6位二进制数据,通过把字符串转化为二进制数据,然后按照每6位二进制数据来进行分割再把这6位二进制数据转化为10进制数找到对应的映射表就可生成base64编码
具体实现步骤如下:
- 字符串转化为2进制数据
- 2进制数据按照每6位一组分割, 不足6位的补0
- 6位二进制数据转化为十进制数
- 在对应的base64映射表中找到对应的映射字符,补0的每两位用一个=号表示
例子
以字符串'A'
为例
- 首先转为16进制数据为
41
对应的二进制数据为01000001
- 每6位二进制数据分割为一组结果为
010000 010000
- 6位二进制转化为10进制的结果为
16 16
- base64映射表对用的字符为
Q Q
- 因为补了4个0所以字符串
A
对用的base64编码就为QQ==
代码实现
function addZero2Front(str) {
let len = str.length
while (len < 8) {
str = '0' + str
len++
}
return str
}
function getBinary(str) {
const buf = Buffer.from(str)
let binary = ''
for (let i = 0; i < buf.length; i++) {
binary += addZero2Front(
buf[i].toString(2)
)
}
return binary
}
function get(binary) {
}
let map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
function base64(str) {
let binary = getBinary(str)
let num = binary.length % 6
let needAddZeroLen = num !== 0 ? 6 - num : num
let i = needAddZeroLen;
let endStr = ''
let res = ''
while (i > 0) {
binary += '0'
i--
}
i = needAddZeroLen
while ( i > 0) {
endStr += '='
i -= 2
}
i = 0
while (i < binary.length) {
let idx = parseInt(
binary.slice(i, i + 6),
2
)
res += map[idx]
i+=6
}
res += endStr
return res
}
结束语
虽然base64可以便于二进制数据传输且不会造成乱码;但是值得注意的是,由于base64的性质(把8个字节转化为6个字节储存),所以不可避免的会把文件的大小增大1/3,所以base64也不可盲目使用
base64的实现原理的更多相关文章
- Base64加密解密原理以及代码实现(VC++)
Base64加密解密原理以及代码实现 转自:http://blog.csdn.net/jacky_dai/article/details/4698461 1. Base64使用A--Z,a--z,0- ...
- Base64编码转换原理
Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法.它其实只是定义用可打印字符传输内容一种方法 ...
- Base64加密转换原理与代码实现
一.Base64实现转换原理 它是用64个可打印字符表示二进制所有数据方法.由于2的6次方等于64,所以可以用每6个位元(bit)为一个单元,对应某个可打印字符.我们知道三个字节(byte)有24个位 ...
- Base64图片编码原理,base64图片工具介绍,图片在线转换Base64
Base64图片编码原理,base64图片工具介绍,图片在线转换Base64 DataURI 允许在HTML文档中嵌入小文件,可以使用 img 标签或 CSS 嵌入转换后的 Base64 编码,减少 ...
- base64编码的原理及实现
base64编码的原理及实现 我们的图片大部分都是可以转换成base64编码的data:image. 这个在将canvas保存为img的时候尤其有用.虽然除ie外,大部分现代浏览器都已经支持原生的基于 ...
- 关于base64编码的原理及实现
我们的图片大部分都是可以转换成base64编码的data:image. 这个在将canvas保存为img的时候尤其有用.虽然除ie外,大部分现代浏览器都已经支持原生的基于base64的encode和d ...
- 关于base64编码的原理和实现
在前文 Data URI 应用场景小结 中我们提到了一个概念,叫做 base64编码,今天我们就来聊聊 base64编码,揭开它的神秘面纱. 一句话解释:Base64是一种基于64个可打印字符来表示二 ...
- Base64加密解密原理以及代码实现
1. Base64使用A--Z,a--z,0--9,+,/ 这64个字符. 2. 编码原理:将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字 ...
- Base64编码的原理
Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于 2的6次方是64,所以每6个比特为一个单元,对应某个可打印字符.3个字节有24个比特,对应于4个Base64单元,即3个字节可由 ...
- 【学习笔记】Base64编码解码原理及手动实现(C#)
1.[Base64编码原理]@叶落为重生 -base64的编码都是按字符串长度,以每3个8bit的字符为一组,-然后针对每组,首先获取每个字符的ASCII编码,-然后将ASCII编码转换成8bit的二 ...
随机推荐
- goland无法解析go mod问题解决
Goland 版本是 2018.03 由于之前使用GOPATH方式进行存在很多项目,在怎么配置后都无法解析包,但是命令行时正常的. 这边设置全局的设置,开启goland的go mod包管理. 创建新项 ...
- [刷题] 257 Binary Tree Paths
要求 给定一棵二叉树,返回所有表示从根节点到叶子节点路径的字符串 示例 ["1->2->5","1->3"] 思路 递归地返回左右子树到叶子节 ...
- 折腾gcc/g++链接时.o文件及库的顺序问题
gcc/g++链接时.o文件以及库的顺序问题 1 写在前面 最近换了xubuntu12.4,把原来的项目co出来编译的时候报"undefined reference to".猜测是 ...
- HBase HA 集群环境搭建
安装准备 确定已安装并启动 HDFS(HA)集群 角色分配如下: node-01: namenode datanode regionserver hmaster zookeeper node-02: ...
- Java JOptionPane 对话框
如果你对 Java 控制台界面下的输入数据和打印输出结果感到有些乏味和厌倦,希望能够像其他计算机软件一样有一个 GUI 界面(图形用户界面). 那么 JOptionPane 对话框也许会让你眼前一亮, ...
- KEIL中查看程序存储空间的大小
Program Size: Code=86496 RO-data=9064 RW-data=1452 ZI-data=16116 Code是代码占用的空间,RO-data是 Read Only 只读常 ...
- Spring Cloud Alibaba(13)---Sleuth概述
Sleuth概述 前言 在微服务架构中,众多的微服务之间互相调用,如何清晰地记录服务的调用链路是一个需要解决的问题.同时,由于各种原因,跨进程的服务调用失败时,运维人员希望能够通过 查看日志和查看服务 ...
- xtrabackup(innobackupex)使用详解
innobackupex实际上是percona-xtrabackup的perl整合脚本,功能当然更强大一些. xtrabackup备份实际上是在线的物理热备,为什么和么说呢,因为实际上他是以拷贝mys ...
- 机器学习PAL基本概念
机器学习PAL基本概念 本文介绍PAI-Studio.PAI-DSW及PAI-EAS的基本概念. PAI-Studio PAI-DSW PAI-EAS
- https ssl(tls)为什么不直接用公钥加密数据?
很多人都提到了非对称加密速度慢,但这只是一个原因,但不是主要原因,甚至是微不足道的原因. SSL协议到3.0后就已经到头了,取而代之的是TLS,相较于SSL的"安全套接字层"的命名 ...