专栏首页沈唁志你知道什么是Base64吗?

你知道什么是Base64吗?

Base64 编码,首先我们应该搞清楚,为什么里面有个 64 的字样呢?其实是因为该编码使用 64 个明文来编码任意 的二进制文件,它里面只使用了 A-Z,a-z,0-9,+,/这 64 个字符,有“略懂”的同学就会说了,里面还有“=”号啊,不错,不过等号不属于编码字符,而是填充字符。

还有就是,为什么发明这么个编码呢,其实这个编码的原理是很简单的,“破解”也很容易,电子邮件刚出来的 时候,只传递英文字符,这没有问题,但是后来,中国人,日本人都要发 email,这样问题就来了,因为这些字符有可能会被邮件服务器或者网关当成命令处 理,故必须得有一种编码来对邮件进行加密,但是加密的目的是为了能够使得一些原始的服务器不出问题(新得牛叉服务器已经能处理这些乱七八糟得情况了,不过 因为已经形成了一套规范,所以邮件还是得经过 Base64 编码才能传递),这样加密必须得简单(那搞个取反,异或加密吧,:-),还是没解决根本问题 咯),加密简单,这样客户端程序加密解密也快,又要是明文 Ascii 编码,这样 Base64 就诞生了。当初设计人员主要是考虑了两个问题:

1、加密算法复杂程度和效率 2、如何处理传输

Base64 基本都能满足,如果因为发一封邮件把 CPU 占到 100%或者把内存给用完了,那就完全没必要了,编码之后只要普通人一眼看不出内容就行了。

下面谈谈 Base64 的编码原理,按照 RFC2045 的定义,The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.我之前在网上查 Base64 的资料时,发现了一个很好的网站, base64 编码在线转换器 :http://www.motobit.com/util/base64-decoder-encoder.asp, 大家对 Base64 感兴趣的话,可以去看看。Base64 编码要求把 3 个 8 位字节(3*8=24)转化为 4 个 6 位的字节(4*6=24),之后在 6 位的前 面补两个 0,形成 8 位一个字节的形式。6bit2 进制能表示的最大数是 2 的 6 次方减一,刚好是 64,这也是为什么是 64 个字符的原因,这样就需要一张映射表,表如下:

索引

对应字符

索引

对应字符

索引

对应字符

索引

对应字符

0

A

17

R

34

i

51

z

1

B

18

S

35

j

52

0

2

C

19

T

36

k

53

1

3

D

20

U

37

l

54

2

4

E

21

V

38

m

55

3

5

F

22

W

39

n

56

4

6

G

23

X

40

o

57

5

7

H

24

Y

41

p

58

6

8

I

25

Z

42

q

59

7

9

J

26

a

43

r

60

8

10

K

27

b

44

s

61

9

11

L

28

c

45

t

62

+

12

M

29

d

46

u

63

/

13

N

30

e

47

v

14

O

31

f

48

w

15

P

32

g

49

x

16

Q

33

h

50

y

    编码原理:将 3 个字节转换成 4 个字节((3 X 8)=24=(4X6)),先读入 3 个字节,每读一个字节,左移 8 位,再右移四次,每次 6 位,这样就有 4 个字节了。 解码原理:将 4 个字节转换成 3 个字节,先读入 4 个 6 位(用或运算),每次左移 6 位,再右移 3 次,每次 8 位,这样就还原了。

Base64 将 3 个字节转变为 4 个字节,因此,编码后的代码量(以字节为单 位,下同)约比编码前的代码量多了 1/3。如果代码量正好是 3 的整数倍,那么恰好多了 1/3。但如果不是呢?这个时候“=”终于派上用场啦,当代码量不是 3 的整数倍时,代码量/3 的余数自然就是 2 或者 1。转换的时候,结果不够 6 位的用 0 来补上相应的位置,之后再在 6 位的前面补两个 0。转换完空出的结果就用 就用“=”来补位,总之要保证最后编码出来得字节数是 4 的倍数。

原理也说了表也给了,大家可以编码了哈…… 沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:你知道什么是Base64吗?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你知道DSL是什么吗?

    虽然在「术」的实践中我们开始百花齐放,但同时也产生了一些误区或迷思,比如会将 DSL 和转编译这种纯技术议题划上等号,比如会分不清内部 DSL 和库(接口)的边...

    前端森林
  • 你知道什么是Spring Boot吗?

    Spring Boot主要是通过注解和自动化配置的方式推出的全新框架,旨在快速、敏捷的开发新一代基于Spring框架的应用程序。在构建Spring Boot项目...

    用户8639654
  • 你知道什么是Spring Boot吗?

    今天让我们一起走进Spring Boot的世界,看看传说中的Spring Boot是什么以及使用它的优势是什么。

    用户8639654
  • 请问你知道什么是栈吗?

    1.1栈的概念及记本操作 栈(stack)又称堆栈,是限制在表的一端进行插入和删除的线性表。其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行...

    Java学习
  • 你知道Python神器IDE是什么吗?

    如上图所示,如果你要安装某个包,进行搜索然后按下apply就可以安装完成了,比传统命令行不知道要好多少多少多少倍(鸭鸭强调)

    开心鸭
  • 为什么 HTTPS 是安全的?你知道吗?

    都知道 HTTPS 安全,可是为什么安全呢?看小电影还是浏览正常网站,一定要检查是不是 HTTPS 的,HTTP有可能被中间人攻击和拦截,下面就是详细的 HTT...

    程序员白楠楠
  • 你知道RGB,那你知道什么是YUV么?

    元旦的时候接到一个任务,对 Android Camera 的缩略图展示性能做一些优化。作为一个 Camera 0 经验的菜鸟,各种铺面而来的专业术语瞬间就让我迷...

    菜天哥哥
  • 都知道Base64,Base32你能实现吗?

    很长时间没有更新个人博客了,因为前一段时间在换工作,入职了一家新的公司,刚开始需要适应一下新公司的节奏,开始阶段也比较忙。新公司还是有一定的技术气氛的,每周都会...

    小忽悠
  • 都知道Base64,Base32你能实现吗?

    很长时间没有更新个人博客了,因为前一段时间在换工作,入职了一家新的公司,刚开始需要适应一下新公司的节奏,开始阶段也比较忙。新公司还是有一定的技术气氛的,每周都会...

    小忽悠
  • 2018-11-18 你知道Adoc文档是什么吗?

    AsciiDoc 是一种轻量级标记语言,它可以让我们以纯文本的形式来书写笔记、文章、文档、书籍、网页、幻灯片和 man 帮助。 本指南是常用的 AsciiDoc...

    Albert陈凯
  • 你真的知道什么是机器学习吗?

    随着人工智能(AI)技术对各行各业有越来越深入的影响,我们也更多地在新闻或报告中听到“机器学习”、“深度学习”、“增强学习”、“神经网络”等词汇,对于非专业人士...

    企鹅号小编
  • 学习过CSS,那你知道BFC是什么吗?

    虽然可能你没听过BFC是什么,但是你一定用过,其是一种在CSS中存在的技术,你可能只是一直不知道有这样一个专业名词,本文就来介绍一下到底什么是BFC

    JowayYoung
  • 你真的知道什么是 “命名空间” 吗?

    命名空间,又名 namesapce,是在很多的编程语言中都会出现的术语,估计很多人都知道这个词,但是让你真的来说这是个什么,估计就歇菜了,所以我觉得 “命名空间...

    Rocky0429
  • 性能测试,你知道什么是99线吗?

    - 场景:(性能测试)场景是若干个基于 HTTP/HTTPS 的 URL/API 的组合。URL/API 可能关联了数据文件表示不同用户。不同的 URL/API...

    互扯程序
  • 你知道HTTP协议的ETag是干什么的吗?

    在HTTP1.1规范中,新增了一个HTTP头信息:ETag。对于普通开发者来说,可能平时真的不会接触到该HTTP头。平时接触不到或者说用得少,不代表这个请求头不...

    Happyjava
  • 你真的知道Java内存模型是什么吗

    前几天,发了一篇文章,介绍了一下JVM内存结构、Java内存模型以及Java对象模型之间的区别。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型...

    格姗知识圈
  • 投资钛值的你,知道钛链是什么吗?

    技术 钛链技术到底有多牛?钛值从技术考量到底有多值?为普及和推广钛值背后的区块链技术,我们的钛值极客团队来给大家上课啦! 搬好小板凳,拿出笔记本,开始学习! 1...

    企鹅号小编
  • 你真的知道Python的字符串是什么吗?

    在《详解Python拼接字符串的七种方式》这篇推文里,我提到过,字符串是程序员离不开的事情。后来,我看到了一个英文版本的说法:

    Python猫
  • R语言什么鬼??你知道吗?

    R语言什么鬼?可以用来做什么?和大数据又有什么关系?有没有好的课程推荐啊?学大数据一定要懂R语言么?…… 网络上太多类似的问题,如果恰好你也有类似的疑惑,那么...

    小莹莹

扫码关注云+社区

领取腾讯云代金券