欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年06月04日 21:42:20   投稿:mdxy-dxy  
這篇文章主要介紹了UUencode 編碼,UU編碼介紹、UUencode編碼轉(zhuǎn)換原理與算法,需要的朋友可以參考下

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

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ù)值只會落在0到63之間。將每個(gè)數(shù)加上32,所產(chǎn)生的結(jié)果剛好落在ASCII字符集中可打印字符(32-空白…95-底線)的范圍之中。每60個(gè)編碼輸出(相當(dāng)于45個(gè)輸入字節(jié))將輸出為獨(dú)立的一行,每行的開頭會加上長度字符,除了最后一行之外,長度字符都應(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,更為簡單!

思考問題:它的字符范圍都是可打印字符,我們會發(fā)現(xiàn)64字符集合中,有很多是特殊字符:”!”#¥%&‘()*+='” 等等。這些字符在不同應(yīng)用中,可能都有些特殊用途。因此,在使用該編碼時(shí)候,或許會出現(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;
		
		///對每個(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ú)立的一行,每行的開頭會加上長度字符,除了最后一行之外,長度字符都應(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)證的代碼,可能會給你帶來麻煩!歡迎分享你的方法!

相關(guān)文章

  • 開發(fā)人員一定要加入收藏夾的網(wǎng)站 推薦

    開發(fā)人員一定要加入收藏夾的網(wǎng)站 推薦

    開發(fā)人員一定要加入收藏夾的網(wǎng)站,比較不錯(cuò)。大家可以參考一下。
    2009-11-11
  • 詳解DES&3DES算法的原理以及C#和JS的實(shí)現(xiàn)

    詳解DES&3DES算法的原理以及C#和JS的實(shí)現(xiàn)

    DES?全稱為?Data?Encryption?Standard,即數(shù)據(jù)加密標(biāo)準(zhǔn),是一種使用密鑰加密的塊算法。3DES?算法通過對?DES?算法進(jìn)行改進(jìn),增加?DES?的密鑰長度來避免類似的攻擊。本文就來聊聊它們的原理與實(shí)現(xiàn)吧
    2023-03-03
  • 分布式醫(yī)療掛號系統(tǒng)整合Gateway網(wǎng)關(guān)解決跨域問題

    分布式醫(yī)療掛號系統(tǒng)整合Gateway網(wǎng)關(guān)解決跨域問題

    這篇文章主要介紹了分布式醫(yī)療掛號系統(tǒng)整合Gateway網(wǎng)關(guān)解決跨域問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • K8ssandra入門教程之Linux上部署K8ssandra到Kubernetes的過程

    K8ssandra入門教程之Linux上部署K8ssandra到Kubernetes的過程

    K8ssandra不僅幫助我們可以快速可靠地在Kubernetes上部署Cassandra,同時(shí)提供了許多組件,如監(jiān)控、備份、同步、訪問等,這篇文章給大家介紹K8ssandra入門教程之Linux上部署K8ssandra到Kubernetes的過程,一起看看吧
    2021-10-10
  • 關(guān)于爬蟲和反爬蟲的簡略方案分享

    關(guān)于爬蟲和反爬蟲的簡略方案分享

    這篇文章主要給大家介紹了一些關(guān)于爬蟲和反爬蟲的簡略方案的相關(guān)資料,文中介紹的非常詳細(xì),對大家理解和學(xué)習(xí)爬蟲與反爬蟲具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • MobaXterm快速入門、高級使用技巧圖文詳解

    MobaXterm快速入門、高級使用技巧圖文詳解

    MobaXterm 提供豐富的自定義選項(xiàng),以滿足個(gè)人偏好和需求,您可以自定義外觀、鍵盤快捷鍵、字體、顏色方案等,這篇文章主要介紹了MobaXterm快速入門、高級使用技巧,需要的朋友可以參考下
    2023-06-06
  • Windows下使用Gogs搭建Git服務(wù)器

    Windows下使用Gogs搭建Git服務(wù)器

    這篇文章介紹了使用Gogs搭建Git服務(wù)器的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 自動駕駛技術(shù)之V2X技術(shù)的介紹

    自動駕駛技術(shù)之V2X技術(shù)的介紹

    本章內(nèi)容介紹了如何利用車輛自身的智能,還可以借助外部環(huán)境實(shí)現(xiàn)信息的獲取,這一類技術(shù)統(tǒng)稱為V2X技術(shù)。接下來我們大家一起來學(xué)習(xí)吧
    2021-08-08
  • 如何將服務(wù)器上的python代碼通過QQ發(fā)送回傳信息(附實(shí)現(xiàn)方法)

    如何將服務(wù)器上的python代碼通過QQ發(fā)送回傳信息(附實(shí)現(xiàn)方法)

    這篇文章主要介紹了我將服務(wù)器上的python代碼通過QQ發(fā)送回傳信息(附實(shí)現(xiàn)方法),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 學(xué)習(xí)哪門編程語言最有前途,最好賺錢,需求量高

    學(xué)習(xí)哪門編程語言最有前途,最好賺錢,需求量高

    近期有很多同學(xué)想學(xué)習(xí)編程,不知道選擇哪種語言比較好,這里簡單的給大家介紹一下,其實(shí)看個(gè)人發(fā)展,無論選擇哪個(gè)只要努力都是賺錢的
    2017-08-08

最新評論