(草稿未完成)
為什么做這個專案?(專案背景)
在計算機中一個位元組共有256種,即ascii碼表,而ascii碼的128~255之間的值是不可見字符,對于一些只支持可見字符的協議,比如郵件傳輸協議(SMTP)只支持可見的ASCII字符的傳遞,如果要傳輸二進制檔案,比如:圖片、視頻是無法實作的,因此就有了base64編碼格式,Base64編碼格式對于所有二進制格式的資料,都可以轉化為可顯示的字符,
- 在網路上交換資料時,比如說從A地傳遞到B地,往往要經過多個路由設備,由于不同的設備對字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯誤,不利于傳輸,
- http先以當中的key-value欄位,必須進行url編碼,不然出現的等號或者空格可能是決議失敗
- 有些文本協議不支持可見字符傳輸,比如簡單郵件傳輸協議(SMTP)
- 網頁中內嵌簡單圖片
這個專案能實作怎么樣的功能?(專案目標)
實作一個在線的base64轉換工具,支持文本的base64可逆轉化以及圖片 base64轉換,
專案用什么框架來實作的?(專案框架)
具體怎么實作的?
1.base64演算法+實作
2.簡單的前端知識:html + CSS + javascript + ajax
3.寫頁面
4.搭建http服務器 ---->使用httplib庫:只需要包含頭檔案
5.前后端調通
1.base64演算法+實作
base64編碼之所以成為base64,是因為其使用64個字符來對二進制資料進行編碼
AZ,az,0~9,+ / 一共64個
從0到63:
“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”
= 用來不夠補位
編碼程序:
對于用戶給的二進制位元流,3個3個位元組一組進行編碼
3個位元組 -------->base64 --------->4個可以顯示的位元組
24個位元位---->base64 ---------->將24個位元位均分為4組,每組6個位元位------>轉為為4個位元組
舉例
字串長度被3整除時
使用base64編碼:man
字串長度不能被3整除時
使用base64編碼:manm
當需要編碼的位元組數不能被3整除時,最后會多出一個或者兩個位元組,先用0位元組值在末尾補足,使其能夠被3整除,然后進行base64編碼,最后在編碼結果后補上一個或者兩個=號,代表補足的位元組數,
比如傳4個位元組,這時多出一個位元組,就要補兩個位元組的0(16個位的0),然后再編碼,最后編碼結果后補兩個個 = 符合,
注意:base64一行最多顯示76個可顯字符
缺陷:base64將三個位元組轉化成四個位元組,因此Base64編碼后的文本,會比原文本大出三分之一左右
base64編碼大致思路:
1.對字符按照三個三個進行分組:ch1、ch2、ch2
2.關鍵操作
被3整除的位元組數
ch1:直接取其高6位-----> ch1>>2 ------>比如M(01001101) 右移兩位------>00010011 ------>轉換十進制19 ----->查base64表:T
將ch1中末尾還剩余的兩位,與ch2中高4四位進行拼接,拼接成6個位元位-------> ( ch1 << 4 | ch2 >> 4) & 0x3F,和0x3F按位與后相當于清零前兩位,即在前兩位補0
M(01001101) 左移4位后--------->11010000
a(01100001)右移4位后----------->00000110
| 拼接后 11010110
& 0x3F后 00010110 --------轉換十進制22 ----->查base64表:W
ch2:還剩低4位,與ch3的高2位來進行拼接,拼接成6個位元位:(ch2 << 2 | ch3 >> 6) &0x3F
a(01100001)左移2位后----------->10000100
n(01101110)右移6位后-----------> 00000001
拼接后10000101
& 0x3F后 00000101--------轉換十進制5 ----->查base64表:F
ch3:還剩低6位,成為一組,前面補兩個0:(ch3 & 0x3F)
n(01101110) & 0x3F-----------> 00101110--------轉換十進制46 ----->查base64表:u
最終得到base64編碼:TWFu
不能被3整除的位元組數
補需要位元組數的0,比如4個位元組缺兩個位元組被3整除,則補2個位元組的0
多出一個位元組:
解碼程序:
1.獲取base64編碼后的每個字符ch
2.獲取ch在編碼表中的下標
3.該下標就是原字符對應的6個位元位
決議出4組之后,就形成了24個位元位,然后將24個位元位劃分為3個位元組
解碼程序就是把編碼逆過來,以aGVsbG8=為例子,四個位元組為一組進行解碼,前四個解碼程序如圖,最終全部解碼為hello
//快速解碼表
const char DecodeTable[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62, // '+'
0, 0, 0,
63, // '/'
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'
0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'
0, 0, 0, 0, 0, 0,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'
};
比如將 aGVsbG8= 進行解碼
int nvalue = 0 nvalue: 00000000 00000000 00000000 00000000
四個一組進行解碼aGVs:
DecodeTable[‘a’] ---->DecodeTable[97] = 26
-------->26(011010)存盤到一個32位int型的第18~23位元的位置:(26 << 18) | nvalue-------> 00000000 01101000 00000000 00000000
DecodeTable[‘G’] ---->DecodeTable[71] = 6 -------->6(000110)
-------->6(000110)存盤到一個32位int型的第12~17位元的位置:(6 << 12) | nvalue-------> 00000000 01101000 01100000 00000000
DecodeTable[‘V’] ---->DecodeTable[86] = 21 -------->21(010101)
-------->21(010101)存盤到一個32位int型的第06~11位元的位置:(21 << 6) | nvalue-------> 00000000 01101000 01100101 01000000
DecodeTable[‘s’] ---->DecodeTable[115] = 44 -------->44(101100)
-------->44(101100)存盤到一個32位int型的第00~05位元的位置:(44) | nvalue-------> 00000000 01101000 01100101 01101100
然后將nvalue從第23位元位開始八位八位讀出共取三個位元組就得到了解碼后的資料:hel
00000000 01101000 01100101 01101100 ------->h(01101000)e(01100101)l(01101100)
bG8=同上解碼程序,不同的是在解碼時遇到 ‘=’ 就結束,解碼結果:lo
aGVsbG8= 解碼結果為:hello
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255616.html
標籤:其他
上一篇:遙感影像處理
