返回顶部
RommHui 2水之精灵LV.1

此人很懒,什么也没有留下

  • 发帖8
  • 主题2
  • 粉丝2
  • 关注0
大家都在看
相关推荐

[其他更多] Base64原理

[复制链接]

签到天数: 6 天

[LV.2]偶尔看看I

2

主题

0

好友

14

积分

水之精灵LV.1

Rank: 2Rank: 2

回帖
6
雪点
51
阅读权限
10
性别
保密
在线时间
6 小时
注册时间
2021-7-15
最后登录
2024-1-7
RommHui 显示全部楼层 发表于 2021-7-15 23:55:42 |阅读模式
本帖最后由 RommHui 于 2022-6-19 03:07 编辑

一、引言
Base64 在现在的网络中大量的使用,它是用于解决把不可见字节转为可见字符的算法。我们一直使用,却不知道其原理,我觉得不太行。我希望通过这篇文章,可以让读者知道,它是怎么样运作的,为什么可以让不可见的字节转成可见的字符。为什么转换后的数据长度是原来的 4 / 3。
二、基本原理
首先Base64为什么叫Base64,我觉得是因为转换后除去等号(=)最多只会出现64个字符。这64个字符分别是
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789
+/
26 + 26 + 10 + 2 = 64


刚好就是64个,我觉得这就是叫Base64的原因。


以字符串“123”为例子,base64结果为“MTIz”。“123”长度为3个字节,正如上图第一行的框框表示的那样。然后在3个字节24个位,平均分割成4份,也就是以6位一份(8 x 3 = 6 x 4 = 24)。然后将4份6位的数据前面添加2个位且都为0。这样一来,就完成了3个字节变4个字节的操作了。因为是6个位,所以 2 的 6 次方就是 64。刚好可以和前面提及的64个字符对应得上。例子中的第一个字节 00001100 转成 10 进制也就是 12 ,也就是 “M” 的位置,所以第一个字节转换成了 “M”。第二个字节 00010011 转成 10 进制也就是 19,可以和 “T” 的位置对应得上。后面 2 个字节也是相同的道理,在这里就不多赘述了,读者可自己验证一下。
也正是因为 Base64 会把 3 个字节转成 4 个字节,所以数据才会是原来数据长度的 4 / 3。
到了这里,你可能还会有疑惑,就是,你可能见过结尾带 “=” (等于号)的 Base64 字符串情况。那下面我就继续用例子说明。
首先,我们知道 Base64 是 3 个字节转 4 个字节的,但是,不是所有的数据长度都是刚好是 3 的倍数,所以就需要用到“=”(等于号)来在后面进行填充。


以 “1” 为例子,经过 Base64 转换后得到 “MQ==”,为什么会这样呢?因为,”1″ 只是占 1 个字节,不够 3 个字节来转 4 个字节,所以就需要 “=”(等于号)来填充后面两个没有缺少的字节,来确保是 4 个字节。从这里可以看出 Base64 字符串长度都是偶数,并且是 4 的整数倍。
三、代码
  1. function encodeUint8ArrayToBase64(u8a){
  2.     var LIST = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  3.     var s = "";
  4.     for(var i = 0;i<u8a.length;i += 3){
  5.         s += LIST[(u8a[i] & 0b11111100) >> 2];
  6.         if(typeof(u8a[i+1])=="undefined"){
  7.             s += LIST[((u8a[i] & 0b00000011) << 4)];
  8.             s += "==";
  9.         }else{
  10.             s += LIST[((u8a[i] & 0b00000011) << 4) + ((u8a[i+1] & 0b11110000) >> 4)];
  11.             if(typeof(u8a[i+2])=="undefined"){
  12.                 s += LIST[((u8a[i+1] & 0b00001111) << 2)];
  13.                 s += "=";
  14.             }else{
  15.                 s += LIST[((u8a[i+1] & 0b00001111) << 2) + ((u8a[i+2] & 0b11000000) >> 6)];
  16.                 s += LIST[(u8a[i+2] & 0b00111111)];
  17.             }
  18.         }
  19.     }
  20.     return s;
  21. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
0 10
分享

签到天数: 762 天

[LV.10]以坛为家III

6

主题

2

好友

1319

积分

土之精灵LV.3

Rank: 7Rank: 7Rank: 7

回帖
481
雪点
8004
阅读权限
60
性别
保密
在线时间
457 小时
注册时间
2019-12-11
最后登录
2025-1-19
jj198307 来自手机 显示全部楼层 发表于 2021-7-16 02:14:58
哇,五明,但你好专业
回复 支持 反对

使用道具 举报

签到天数: 767 天

[LV.10]以坛为家III

92

主题

0

好友

3911

积分

风之精灵LV.2

Rank: 13Rank: 13Rank: 13

回帖
3653
雪点
435
阅读权限
80
在线时间
1124 小时
注册时间
2019-1-12
最后登录
2023-2-19
风格 显示全部楼层 发表于 2021-7-16 03:01:38
多谢老师讲解
回复 支持 反对

使用道具 举报

签到天数: 3617 天

[LV.Master]伴坛终老

1537

主题

6

好友

10万

积分

管理员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

回帖
101124
雪点
18584
阅读权限
255
在线时间
12667 小时
注册时间
2013-11-20
最后登录
2025-1-19
wai008 显示全部楼层 发表于 2021-7-16 10:06:29
這位同學的功課作業雖然不夠詳細, 但也算不錯. 作業中, 不知導師的評分如何呢?

當中最顯眼出錯的地方, 我就說一下, 其他就不詳講了, 因為文中解釋不盡.
首先, 樓主對26個英文字母都不認真熟識, 常聽人說, 現在大學生連26字母都可以記錯, 原來是真的

ABCDEFGHIJKLMNOPQRSTUVWXYZ, 樓主不要以為MN倒轉是少事, M是排在13位, N是14位, 26個字對應數字用途非常廣泛, 有好多地方是可用來計算輸入資料有無錯誤的程式, 在此也不詳盡

另外一點小錯是小階英文, xyz , 樓主打了 xyx

樓主的 function 應該是網上抄來的, 當中的英文次序是正確的
回复 支持 反对

使用道具 举报

签到天数: 3875 天

[LV.Master]伴坛终老

42

主题

9

好友

6万

积分

精灵王☆

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

回帖
68118
雪点
9354
阅读权限
130
在线时间
6404 小时
注册时间
2013-3-22
最后登录
2025-1-19
神之影 显示全部楼层 发表于 2021-7-16 12:41:54
不明觉厉!
回复 支持 反对

使用道具 举报

签到天数: 1368 天

[LV.10]以坛为家III

37

主题

3

好友

6万

积分

精灵王☆

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

回帖
54893
雪点
53181
阅读权限
130
性别
在线时间
1916 小时
注册时间
2020-7-8
最后登录
2025-1-19
希索加 显示全部楼层 发表于 2021-7-16 13:25:51
体都唔系好明白讲咩
回复 支持 反对

使用道具 举报

签到天数: 942 天

[LV.10]以坛为家III

4

主题

7

好友

5万

积分

精灵王☆

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

回帖
50045
雪点
8303
阅读权限
130
在线时间
2345 小时
注册时间
2019-9-16
最后登录
2022-6-2
vx2240w 显示全部楼层 发表于 2021-7-17 02:05:31
原來Base64原理咁複雜架,我真係睇唔明啵
回复 支持 反对

使用道具 举报

签到天数: 1247 天

[LV.10]以坛为家III

11

主题

0

好友

9317

积分

风之精灵LV.3

Rank: 15Rank: 15Rank: 15

回帖
5341
雪点
39119
阅读权限
90
在线时间
1101 小时
注册时间
2021-7-5
最后登录
2025-1-19
logiciel 显示全部楼层 发表于 2021-7-19 09:59:02
作為普通用家,上邊理論太pro,用家關注嘅係「點樣用一部老爺機可以睇高解析度嘅網路圖片」淨上邊理論可以幫到手嘅基本係冇可能!

作為網路/網站設計等高階用家,上邊理論就好似上堂講書!實作點解決「點樣用一部老爺機可以睇高解析度嘅網路圖片」,base64並唔係一個好嘅選擇,無論係CSS或html....


回复 支持 反对

使用道具 举报

签到天数: 653 天

[LV.9]以坛为家II

3

主题

0

好友

1875

积分

风之精灵LV.1

Rank: 8Rank: 8Rank: 8Rank: 8

回帖
1735
雪点
699
阅读权限
70
性别
在线时间
3590 小时
注册时间
2021-2-24
最后登录
2025-1-19
4547830 来自手机 显示全部楼层 发表于 2021-7-21 20:16:06
哗好高级阿,学下野先
回复 支持 反对

使用道具 举报

签到天数: 6 天

[LV.2]偶尔看看I

2

主题

0

好友

14

积分

水之精灵LV.1

Rank: 2Rank: 2

回帖
6
雪点
51
阅读权限
10
性别
保密
在线时间
6 小时
注册时间
2021-7-15
最后登录
2024-1-7
RommHui 显示全部楼层 发表于 2022-6-19 02:57:28
本帖最后由 RommHui 于 2022-6-19 02:58 编辑
wai008 发表于 2021-7-16 10:06
這位同學的功課作業雖然不夠詳細, 但也算不錯. 作業中, 不知導師的評分如何呢?

當中最顯眼出錯的地方,  ...

多谢你嘅指正,function先係我自己按照原理寫的,字母那張圖我應該是在別處找的,不過自己真的不太小心,沒有檢查清楚就放上去
回复 支持 反对

使用道具 举报

回帖须知:严禁发表粗言秽语、纯表情、纯数字等无意义内容,更多规则请参阅论坛总版规
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

粤梦缘是国内粤语爱好者社区,集动漫、影视、音乐的综合性分享及交流平台。 网站共设,动漫资讯、动漫分享、漫画分享、讨论等多个频道。
  • 官方手机版

  • 官方QQ群

  • 商务合作

  • Powered by Discuz! X3.4 | Copyright © 2001-2023, Tencent Cloud. | 粤梦缘
  • | 营业执照 |粤梦缘网络有限公司|鲁ICP备19001237号-21|鲁公网安备 4236902302000354号