最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Base64 編碼介紹、Base64編碼轉(zhuǎn)換原理與算法

 更新時(shí)間:2016年06月04日 23:48:51   投稿:mdxy-dxy  
Base64編碼,是我們程序開(kāi)發(fā)中經(jīng)常使用到的編碼方法。它是一種基于用64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的表示方法,需要的朋友可以參考下

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

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

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

編號(hào) 字符 編號(hào) 字符 編號(hào) 字符 編號(hào) 字符
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 /

Base64編碼轉(zhuǎn)換算法、轉(zhuǎn)換原理

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

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

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

文本 M a n
ASCII編碼 77 97 110
二進(jìn)制位 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
Base64編碼 T W F u

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

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

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

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

/**
 *base64編碼方法、本方法只是做base64轉(zhuǎn)換過(guò)程代碼舉例說(shuō)明,通過(guò)該例子可以任意改造不同語(yǔ)言版
 *@author 程默
 *@copyright http://blog.chacuo.net
 *@param $src 原字符串
 *@return string base64字符串*
 */
function c_base64_encode($src)
{
	static $base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	
	////將原始的3個(gè)字節(jié)轉(zhuǎn)換為4個(gè)字節(jié)
	$slen=strlen($src);
	$smod = ($slen%3);
	$snum = floor($slen/3);
	
	
	$desc = array();
	
	for($i=0;$i<$snum;$i++)
	{
		////讀取3個(gè)字節(jié)
		$_arr = array_map('ord',str_split(substr($src,$i*3,3)));
		
		///計(jì)算每一個(gè)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);
	
	///計(jì)算非3倍數(shù)字節(jié)
	$_arr = array_map('ord',str_split(substr($src,$snum*3,3)));
	$_dec0= $_arr[0]>>2;
	///只有一個(gè)字節(jié)
	if(!isset($_arr[1]))
	{
		$_dec1= (($_arr[0]&3)<<4);
		$_dec2=$_dec3="=";
	}
	else 
	{
		///2個(gè)字節(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);
}

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

相關(guān)文章

  • Protobuf在Cmake中的正確使用方法詳解

    Protobuf在Cmake中的正確使用方法詳解

    這篇文章主要介紹了Protobuf在Cmake中的正確使用方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 數(shù)據(jù)分析2020年全國(guó)各省高考成績(jī)分布情況

    數(shù)據(jù)分析2020年全國(guó)各省高考成績(jī)分布情況

    這篇文章主要介紹了數(shù)據(jù)分析2020年全國(guó)各省高考成績(jī)分布情況,順便可以用這個(gè)數(shù)據(jù)看每個(gè)省市的一本線劃分比率,還有其他相關(guān)的數(shù)據(jù),需要的朋友可以參考下
    2020-07-07
  • Atom-IDE 的使用方法簡(jiǎn)單介紹

    Atom-IDE 的使用方法簡(jiǎn)單介紹

    這篇文章主要介紹了Atom-IDE 的使用方法簡(jiǎn)單介紹的相關(guān)資料,Facebook 和 GitHub 兩大巨頭聯(lián)手推出 Atom-IDE,這里介紹下如何使用,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 矩形相交以及求出相交的區(qū)域的原理解析

    矩形相交以及求出相交的區(qū)域的原理解析

    問(wèn)題:給定兩個(gè)矩形A和B,矩形A的左上角坐標(biāo)為(Xa1,Ya1),右下角坐標(biāo)為(Xa2,Ya2),矩形B的左上角坐標(biāo)為(Xb1,Yb1),右下角 坐標(biāo)為(Xb2,Yb2)。
    2011-01-01
  • 字符編碼詳解(基礎(chǔ))

    字符編碼詳解(基礎(chǔ))

    字符編碼問(wèn)題, 對(duì)于一個(gè)在偉大天朝的程序員來(lái)說(shuō), 幾乎不可能遇不到, 從我剛開(kāi)始接觸Coding到現(xiàn)在, 亂碼, 編碼轉(zhuǎn)換問(wèn)題就好像一直沒(méi)有停息過(guò).

    2009-09-09
  • 基數(shù)排序算法的原理與實(shí)現(xiàn)詳解(Java/Go/Python/JS/C)

    基數(shù)排序算法的原理與實(shí)現(xiàn)詳解(Java/Go/Python/JS/C)

    基數(shù)排序(RadixSort)是一種非比較型整數(shù)排序算法,其原理是將整數(shù)按位數(shù)切割成不同的數(shù)字,然后按每個(gè)位數(shù)分別比較。本文將利用Java/Go/Python/JS/C不同語(yǔ)言實(shí)現(xiàn)基數(shù)排序算法,感興趣的可以了解一下
    2023-03-03
  • Markdown語(yǔ)法手冊(cè)—完整筆記整理

    Markdown語(yǔ)法手冊(cè)—完整筆記整理

    Markdown是一種輕量級(jí)標(biāo)記語(yǔ)言,創(chuàng)始人為約翰·格魯伯(John?Gruber),?它允許人們使用易讀易寫(xiě)的純文本格式編寫(xiě)文檔,然后轉(zhuǎn)換成有效的?XHTML(或者HTML)文檔,由于Markdown的輕量化、易讀易寫(xiě)特性,并且對(duì)于圖片,圖表、數(shù)學(xué)式都有支持,許多網(wǎng)站都廣泛使用Markdown
    2024-08-08
  • 編程語(yǔ)言里的靜態(tài)、動(dòng)態(tài)、強(qiáng)類型、弱類型等概念介紹

    編程語(yǔ)言里的靜態(tài)、動(dòng)態(tài)、強(qiáng)類型、弱類型等概念介紹

    這篇文章主要介紹了編程語(yǔ)言里的靜態(tài)、動(dòng)態(tài)、強(qiáng)類型、弱類型等概念介紹,需要的朋友可以參考下
    2015-05-05
  • git checkout 命令使用詳解

    git checkout 命令使用詳解

    這篇文章主要介紹了git checkout 命令使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 簡(jiǎn)單介紹HTTP請(qǐng)求方式中8種請(qǐng)求方法

    簡(jiǎn)單介紹HTTP請(qǐng)求方式中8種請(qǐng)求方法

    這篇文章主要介紹了HTTP請(qǐng)求方式中8種請(qǐng)求方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

仙桃市| 谷城县| 永州市| 宣威市| 石棉县| 崇信县| 和顺县| 特克斯县| 铁岭市| 罗源县| 合山市| 浦江县| 伊通| 湘潭县| 宁城县| 仁寿县| 汶上县| 青河县| 左云县| 通城县| 西和县| 临武县| 东台市| 阿图什市| 张家界市| 临邑县| 马关县| 财经| 田阳县| 龙胜| 蚌埠市| 托里县| 达拉特旗| 上犹县| 海口市| 区。| 莱州市| 大新县| 绿春县| 保德县| 高碑店市|