找回密码
 立即注册
快捷导航
发帖
飘盘 聊天 资讯 萌图 漫画 动画 规则 帮助 手机客户端 新手指南
查看: 367|回复: 10

[其他更多] Base64原理

[复制链接]

签到天数: 6 天

[LV.2]偶尔看看I

2

主题

0

好友

14

积分

水之精灵LV.1

Rank: 2Rank: 2

回帖
6
雪点
51
阅读权限
10
性别
保密
在线时间
6 小时
注册时间
2021-7-15
最后登录
2024-1-7
发表于 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

签到天数: 762 天

[LV.10]以坛为家III

6

主题

2

好友

1371

积分

土之精灵LV.3

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

签到天数: 767 天

[LV.10]以坛为家III

92

主题

0

好友

3911

积分

风之精灵LV.2

Rank: 13Rank: 13Rank: 13

回帖
3653
雪点
437
阅读权限
80
在线时间
1124 小时
注册时间
2019-1-12
最后登录
2023-2-19
发表于 2021-7-16 03:01:38 | 显示全部楼层
多谢老师讲解
本人所有發言純屬當時的即興娛樂,只有10分鈡保質期,也不代表本人任何觀點、興趣、愛好、想法……本人永不承認做過任何事情,所以請高人不用嘲笑諷刺攻擊!已經注銷網盤……
有钱出钱,有力出力,分享万岁~
回复 支持 反对

使用道具 举报

签到天数: 3688 天

[LV.Master]伴坛终老

1541

主题

6

好友

10万

积分

管理员

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

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

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

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

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

樓主的 function 應該是網上抄來的, 當中的英文次序是正確的
有聲 無畫面, 出不了字幕, 以下的播放器可以幫到
potplayer download link -&gt;  https://potplayer.daum.net/?lang=zh_CN
PotPlayer 免安裝版百度下載點 https://pan.baidu.com/s/1hDhM5gijGSzGCTiJgipvfA
MPC download link -&gt; http://www.free-codecs.com/k_lite_codec_pack_download.htm
回复 支持 反对

使用道具 举报

签到天数: 3936 天

[LV.Master]伴坛终老

43

主题

9

好友

7万

积分

精灵王☆

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

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

使用道具 举报

签到天数: 1413 天

[LV.10]以坛为家III

37

主题

3

好友

6万

积分

精灵王☆

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

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

使用道具 举报

签到天数: 942 天

[LV.10]以坛为家III

4

主题

7

好友

5万

积分

精灵王☆

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

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

使用道具 举报

签到天数: 1316 天

[LV.10]以坛为家III

11

主题

0

好友

9519

积分

风之精灵LV.3

Rank: 15Rank: 15Rank: 15

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

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


回复 支持 反对

使用道具 举报

签到天数: 653 天

[LV.9]以坛为家II

3

主题

0

好友

1929

积分

风之精灵LV.1

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

回帖
1747
雪点
1102
阅读权限
70
性别
在线时间
3759 小时
注册时间
2021-2-24
最后登录
2025-3-30
发表于 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
 楼主| 发表于 2022-6-19 02:57:28 | 显示全部楼层
本帖最后由 RommHui 于 2022-6-19 02:58 编辑
wai008 发表于 2021-7-16 10:06
這位同學的功課作業雖然不夠詳細, 但也算不錯. 作業中, 不知導師的評分如何呢?

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

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

使用道具 举报

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

本版积分规则

下载客户端
安卓客户端 IOS客户端

快来加入我们吧!!

官方QQ群号

飘雪动漫社

Powered by Discuz! X3.4© 2001-2023 Comsenz Inc.

手机版| 小黑屋| Archiver| 粤梦缘

GMT+8, 2025-3-31 12:33 , Processed in 0.029546 second(s), 32 queries , Redis On.