佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > UUencode 編碼,UU編碼介紹、UUencode編碼轉(zhuǎn)換原理與算法

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

熱門標(biāo)簽:鐵路電話系統(tǒng) 智能手機(jī) 銀行業(yè)務(wù) 美圖手機(jī) 檢查注冊(cè)表項(xiàng) 服務(wù)器配置 網(wǎng)站文章發(fā)布 呼叫中心市場(chǎng)需求

UUencode編碼起先用在unix網(wǎng)絡(luò)中,先是Unix系統(tǒng)下將二進(jìn)制的資料借由uucp郵件系統(tǒng)傳輸?shù)囊粋€(gè)編碼程式,也是一種二進(jìn)制到文字的編碼。不屬于MIME編碼中一員。它也是定義了用可打印字符表示二進(jìn)制文字一種方法,并不是一種新的編碼集合。主要解決,二進(jìn)制字符在傳輸、存儲(chǔ)中問題。它早期在電子郵件中使用較多,最近這些年來基本上被MIME 中Base64所取代了。E-mail中一般采用UU、MIME、BINHEX三種編碼標(biāo)準(zhǔn)! 我想,了解下這種編碼將二進(jìn)制字符轉(zhuǎn)換為可打印字符實(shí)現(xiàn)思路!對(duì)我們以后做類似處理工作,應(yīng)該會(huì)有很多的啟示。

UUencode編碼過程

Uuencode將輸入資料以每三個(gè)字節(jié)為單位進(jìn)行編碼,如此重復(fù)進(jìn)行。如果最后剩下的資料少于三個(gè)字節(jié),不夠的部份用零補(bǔ)齊。這三個(gè)字節(jié)共有24個(gè)Bit,以6-bit為單位分為4個(gè)群組,每個(gè)群組以十進(jìn)制來表示所出現(xiàn)的數(shù)值只會(huì)落在0到63之間。將每個(gè)數(shù)加上32,所產(chǎn)生的結(jié)果剛好落在ASCII字符集中可打印字符(32-空白…95-底線)的范圍之中。每60個(gè)編碼輸出(相當(dāng)于45個(gè)輸入字節(jié))將輸出為獨(dú)立的一行,每行的開頭會(huì)加上長度字符,除了最后一行之外,長度字符都應(yīng)該是'M'這個(gè)ASCII字符(77=32+45),最后一行的長度字符為32+剩下的字節(jié)數(shù)目這個(gè)ASCII字符。如果是一個(gè) 0字節(jié)那它應(yīng)該被轉(zhuǎn)換為0×60而不是0×20,因?yàn)椋ㄇ耙?`')優(yōu)于 0×20(空格' ‘)。

特點(diǎn)一:看到特點(diǎn)了吧,也是64字符,也是一組6位。怎么,怎么,跟我們的base64這么相似呢?是的,從這個(gè)定義中,我們確實(shí)發(fā)現(xiàn)它跟base64比起來很相似了。

特點(diǎn)二:它定義64字符,不用寫映射表,是通過加32轉(zhuǎn)換到可打印字符范圍中。比起base64,更為簡(jiǎn)單!

思考問題:它的字符范圍都是可打印字符,我們會(huì)發(fā)現(xiàn)64字符集合中,有很多是特殊字符:”!”#¥%‘()*+='” 等等。這些字符在不同應(yīng)用中,可能都有些特殊用途。因此,在使用該編碼時(shí)候,或許會(huì)出現(xiàn)一些問題。我想這也許是UUencode編碼方法,逐漸被Base64所取代的原因吧。

UUencode 64字符集

可打印字符 十進(jìn)制ASCII值 uuencode
二進(jìn)制表示
uuencode
十進(jìn)制表示
可打印字符 十進(jìn)制ASCII值 uuencode
二進(jìn)制表示
uuencode
十進(jìn)制表示
(space) 32 000 000 0 @ 64 100 000 32
! 33 000 001 1 A 65 100 001 33
" 34 000 010 2 B 66 100 010 34
# 35 000 011 3 C 67 100 011 35
$ 36 000 100 4 D 68 100 100 36
% 37 000 101 5 E 69 100 101 37
38 000 110 6 F 70 100 110 38
' 39 000 111 7 G 71 100 111 39
( 40 001 000 8 H 72 101 000 40
) 41 001 001 9 I 73 101 001 41
* 42 001 010 10 J 74 101 010 42
+ 43 001 011 11 K 75 101 011 43
, 44 001 100 12 L 76 101 100 44
- 45 001 101 13 M 77 101 101 45
. 46 001 110 14 N 78 101 110 46
/ 47 001 111 15 O 79 101 111 47
0 48 010 000 16 P 80 110 000 48
1 49 010 001 17 Q 81 110 001 49
2 50 010 010 18 R 82 110 010 50
3 51 010 011 19 S 83 110 011 51
4 52 010 100 20 T 84 110 100 52
5 53 010 101 21 U 85 110 101 53
6 54 010 110 22 V 86 110 110 54
7 55 010 111 23 W 87 110 111 55
8 56 011 000 24 X 88 111 000 56
9 57 011 001 25 Y 89 111 001 57
: 58 011 010 26 Z 90 111 010 58
; 59 011 011 27 [ 91 111 011 59
60 011 100 28 \ 92 111 100 60
= 61 011 101 29 ] 93 111 101 61
> 62 011 110 30 ^ 94 111 110 62
? 63 011 111 31 _ 95 111 111 63
` 96 (1) 000 000 64

UUencode編碼轉(zhuǎn)換過程

原始字符 C a t
原始ASCII碼(十進(jìn)制) 67 97 116
ASCII碼(二進(jìn)制) 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0
新的十進(jìn)制數(shù)值 16 54 5 52
+32 48 86 37 84
編碼后的Uuencode字符 0 V % T

字符串:'Cat‘ 編碼后是:oV%T
UUencode PHP實(shí)現(xiàn)過程

編碼轉(zhuǎn)換過程,與Base64類似!下面代碼是實(shí)現(xiàn)過程,我們可以看看轉(zhuǎn)換方法!

/**
 *uuencode編碼*
 *@author 程默
 *@copyright http://blog.chacuo.net/
 *@param string $src 待處理字符串
 *@return string encode編碼完字符串
 */
function c_uu_encode($src)
{
	///每次讀取3個(gè)字節(jié)
	$lbyte = 3;
	////將原始的3個(gè)字節(jié)轉(zhuǎn)換為4個(gè)字節(jié)
	$slen=strlen($src);
	$smod = ($slen%$lbyte);
	$snum = floor($slen/$lbyte);


	$desc = array();
	
	//將剩下字節(jié)以0字節(jié)補(bǔ)齊
	$src = $smod===0?$src:$src.str_repeat("\0",$lbyte-$smod);
	$snum = $smod===0?$snum:$snum+1;

	for($i=0;$i$snum;$i++)
	{
		////讀取3個(gè)字節(jié)
		$_arr = array_map('ord',str_split(substr($src,$i*$lbyte,$lbyte)));

		///計(jì)算每一個(gè)6位值
		$_dec = array();
		$_dec[]=$_arr[0]>>2;
		$_dec[]=(($_arr[0]3)4)|($_arr[1]>>4);
		$_dec[]=(($_arr[1]0xF)2)|($_arr[2]>>6);
		$_dec[]=$_arr[2]63;
		
		///對(duì)每個(gè)6位值加上32,讀取ascii碼 如果6位值是0,以字符"`"代替
		foreach ($_dec as $v)
		{
			$v = $v===0?'`':chr($v+32);
		}
		$desc = array_merge($desc,$_dec);
	}
	//return implode('',$desc);
	
	///以上代碼只是進(jìn)行轉(zhuǎn)換,沒有進(jìn)一步進(jìn)行
	//每60個(gè)編碼輸出(相當(dāng)于45個(gè)輸入字節(jié))將輸出為獨(dú)立的一行,每行的開頭會(huì)加上長度字符,除了最后一行之外,長度字符都應(yīng)該是'M'這個(gè)ASCII字符(77=32+45),最后一行的長度字符為32+剩下的字節(jié)數(shù)目這個(gè)ASCII字符。
	$abyte = 60;
	$crlf = "\r\n";
	$alen = count($desc);
	$anum = floor($alen/$abyte);
	$amod = ($alen%$abyte);
	
	$adesc = array();
	
	for ($i=0;$i$anum;$i++)
	{
		$adesc[]='M'.implode('',array_slice($desc,$i*$abyte,$abyte)).$crlf;
	}
	
	///截取后面剩余數(shù)組長度
	if($amod!==0)
	{
		///以下計(jì)算不滿45字節(jié)編碼情況
		$adesc[]=chr($amod/4*3+32+($smod?$smod-$lbyte:$smod)).implode('',array_slice($desc,-$amod)).$crlf;
	}
	
	return implode('',$adesc);	
}

以上只是按照轉(zhuǎn)換過程,通過PHP代碼實(shí)現(xiàn)方法!目前PHP沒有UUencode轉(zhuǎn)換模塊!

該代碼轉(zhuǎn)換結(jié)果,跟使用工具轉(zhuǎn)換結(jié)果一致。我查看了線上一些轉(zhuǎn)換方法,很多結(jié)果不一致!最好,大家使用在線工具轉(zhuǎn)換前,做一下比較!沒有做過驗(yàn)證的代碼,可能會(huì)給你帶來麻煩!歡迎分享你的方法!

標(biāo)簽:沈陽 樂山 河南 新疆 滄州 上海 紅河 長治

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《UUencode 編碼,UU編碼介紹、UUencode編碼轉(zhuǎn)換原理與算法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    阿克苏市| 固始县| 杭锦后旗| 青海省| 孟州市| 淮滨县| 松潘县| 恩平市| 扎赉特旗| 吴旗县| 九龙坡区| 克山县| 宁强县| 嘉兴市| 柞水县| 阿尔山市| 温宿县| 诏安县| 呼图壁县| 宁远县| 吉林省| 天等县| 永昌县| 视频| 霸州市| 静海县| 丰镇市| 油尖旺区| 叶城县| 延津县| 南通市| 上虞市| 弥渡县| 耒阳市| 鄯善县| 平阴县| 青河县| 尚志市| 马山县| 城口县| 堆龙德庆县|