日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Base64 算法原理,以及编码、解码【加密、解密】 介绍

發(fā)布時間:2023/12/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Base64 算法原理,以及编码、解码【加密、解密】 介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Base64編碼,是我們程序開發(fā)中經(jīng)常使用到的編碼方法。它是一種基于用64個可打印字符來表示二進制數(shù)據(jù)的表示方法。它通常用作存儲、傳輸一些二進制數(shù)據(jù)編碼方法!也是MIME(多用途互聯(lián)網(wǎng)郵件擴展,主要用作電子郵件標準)中一種可打印字符表示二進制數(shù)據(jù)的常見編碼方法!它其實只是定義用可打印字符傳輸內(nèi)容一種方法,并不會產(chǎn)生新的字符集!有時候,我們學習轉(zhuǎn)換的思路后,我們其實也可以結合自己的實際需要,構造一些自己接口定義編碼方式。好了,我們一起看看,它的轉(zhuǎn)換思路吧!

Base64實現(xiàn)轉(zhuǎn)換原理

??? 它是用64個可打印字符表示二進制所有數(shù)據(jù)方法。由于2的6次方等于64,所以可以用每6個位元為一個單元,對應某個可打印字符。我們知道三個字節(jié)有24個位元,就可以剛好對應于4個Base64單元,即3個字節(jié)需要用4個Base64的可打印字符來表示。在Base64中的可打印字符包括字母A-Z、a-z、數(shù)字0-9 ,這樣共有62個字符,此外兩個可打印符號在不同的系統(tǒng)中一般有所不同。但是,我們經(jīng)常所說的Base64另外2個字符是:“+/”。這64個字符,所對應表如下。

編號 字符 ? 編號 字符 ? 編號 字符 ? 編號 字符
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 /

??? 轉(zhuǎn)換的時候,將三個byte的數(shù)據(jù),先后放入一個24bit的緩沖區(qū)中,先來的byte占高位。數(shù)據(jù)不足3byte的話,于緩沖區(qū)中剩下的bit用0補足。然后,每次取出6個bit,按照其值選擇
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作為編碼后的輸出。不斷進行,直到全部輸入數(shù)據(jù)轉(zhuǎn)換完成。

??? 如果最后剩下兩個輸入數(shù)據(jù),在編碼結果后加1個“=”;如果最后剩下一個輸入數(shù)據(jù),編碼結果后加2個“=”;如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。

??? 編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長,為原來的4/3。無論什么樣的字符都會全部被編碼,因此不像Quoted-printable?編碼,還保留部分可打印字符。所以,它的可讀性不如Quoted-printable編碼!

文本 ASCII編碼 二進制位 索引 Base64編碼
M a n
77 97 110
0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
19 22 5 46
T W F u

???? M的Ascii碼是77,前六位對應值為19,對應base64字符是T,如此類推。其它字符編碼就可以自動轉(zhuǎn)換得到!我們看看另外不是剛好是3個字節(jié)的情況!

文本(1 Byte) 二進制位 二進制位(補0) Base64編碼 文本(2 Byte) 二進制位 二進制位(補0) Base64編碼
A ? ?
0 1 0 0 0 0 0 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
0 1 0 0 0 0 0 1 0 0 0 0 ? ? ? ? ? ? ? ? ? ? ? ?
Q Q = =
B C ?
0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 ? ? x x x x x x
0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 0 x x x x x x
Q k M ?=

Base64轉(zhuǎn)換代碼實現(xiàn)

???? 既然知道了方法,那么我們?nèi)绻约簩憘€簡單轉(zhuǎn)換,好像也是很容易的!下面,我寫下我做轉(zhuǎn)換php代碼!

<?php

/**

*base64編碼方法、本方法只是做base64轉(zhuǎn)換過程代碼舉例說明,通過該例子可以任意改造不同語言版

*@author 程默

*@copyright?http://blog.chacuo.net

*@param $src 原字符串

*@return string base64字符串*

*/

function?c_base64_encode($src)

{

static?$base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

將原始的3個字節(jié)轉(zhuǎn)換為4個字節(jié)

$slen=strlen($src);

$smod?= ($slen%3);

$snum?=?floor($slen/3);

$desc?=?array();

for($i=0;$i<$snum;$i++)

{

讀取3個字節(jié)

$_arr?=?array_map('ord',str_split(substr($src,$i*3,3)));

///計算每一個base64值

$_dec0=?$_arr[0]>>2;

$_dec1= (($_arr[0]&3)<<4)|($_arr[1]>>4);

$_dec2= (($_arr[1]&0xF)<<2)|($_arr[2]>>6);?

$_dec3=?$_arr[2]&63;

$desc?=?array_merge($desc,array($base[$_dec0],$base[$_dec1],$base[$_dec2],$base[$_dec3]));

}

if($smod==0)?return?implode('',$desc);

///計算非3倍數(shù)字節(jié)

$_arr?=?array_map('ord',str_split(substr($src,$snum*3,3)));

$_dec0=?$_arr[0]>>2;

///只有一個字節(jié)

if(!isset($_arr[1]))

{

$_dec1= (($_arr[0]&3)<<4);

$_dec2=$_dec3="=";

}

else

{

///2個字節(jié)

$_dec1= (($_arr[0]&3)<<4)|($_arr[1]>>4);

$_dec2=?$base[($_arr[1]&7)<<2];

$_dec3="=";

}

$desc?=?array_merge($desc,array($base[$_dec0],$base[$_dec1],$_dec2,$_dec3));

return?implode('',$desc);

}

??? 好了,通過這個例子,我想base64編碼轉(zhuǎn)換原理、算法有些了解了吧!它轉(zhuǎn)換過程很簡單,只需要做個映射表,然后將原先做一些移位運算就可以完成!我們通過該例子,是不是可以做個自己的base32這類的編碼呢!歡迎朋友們交流!

總結

以上是生活随笔為你收集整理的Base64 算法原理,以及编码、解码【加密、解密】 介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。