XXencode 編碼,XX編碼介紹、XXencode編碼轉(zhuǎn)換原理與算法
Xxencode編碼,也是一個(gè)二進(jìn)制字符轉(zhuǎn)換為普通打印字符方法。跟UUencode編碼原理方法很相似,唯獨(dú)不同的是可打印字符不同。通個(gè)UUencode編碼,我們知道它有個(gè)缺點(diǎn)就是,64個(gè)可打印字符中,有很多的特殊字符。而XXencode編碼方法,對64個(gè)原字符有做規(guī)范。這里它有跟Base64類型了。都有指定可打印字符范圍、及編號。Xxencode編碼在上世紀(jì)后期,IBM大型機(jī)中得到很廣泛的應(yīng)用?,F(xiàn)在逐漸被Base64編碼轉(zhuǎn)換方法所取代了。
Xxencode編碼原理
XXencode將輸入文本以每三個(gè)字節(jié)為單位進(jìn)行編碼。如果最后剩下的資料少于三個(gè)字節(jié),不夠的部份用零補(bǔ)齊。這三個(gè)字節(jié)共有24個(gè)Bit,以6bit為單位分為4個(gè)組,每個(gè)組以十進(jìn)制來表示所出現(xiàn)的數(shù)值只會落在0到63之間。以所對應(yīng)值的位置字符代替。它所選擇的可打印字符是:+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,一共64個(gè)字符。跟base64打印字符相比,就是uuencode多一個(gè)“-” 字符,少一個(gè)”/” 字符。 但是,它里面字符順序與Base64完全不一樣。與UUencode比較,這里面所選擇字符,都是常見字符,沒有特殊字符。這也決定它當(dāng)年流行使用原因!
每60個(gè)編碼輸出(相當(dāng)于45個(gè)輸入字節(jié))將輸出為獨(dú)立的一行,每行的開頭會加上長度字符,除了最后一行之外,長度字符都應(yīng)該是“h”這個(gè)字符(45,剛好是64字符中,第45位'h'字符),最后一行的長度字符為剩下的字節(jié)數(shù)目 在64字符中位置所代表字符。
問題:uuencode編碼轉(zhuǎn)換為xxencode編碼怎么樣操作?
從2中編碼原理來看,幾乎一樣。就是所用的64個(gè)字符不一樣。一次,簡單對uuencode轉(zhuǎn)換后字符,逐位(處理'`'字符)減去32,然后得到一個(gè)值。這個(gè)值在xxencode 64字符中所對應(yīng)位置字符替換即可。
XXencode編碼轉(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 | ||||||||||||||||||||
編碼后的XXencode字符 | E | q | 3 | O |
XXencode編碼PHP實(shí)現(xiàn)過程
/** *xxencode編碼* *@author 程默 *@copyright http://blog.chacuo.net/ *@param string $src 待處理字符串 *@return string encode編碼完字符串 */ function c_xx_encode($src) { //64個(gè)可打印字符 static $base="+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; ///每次讀取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; ///求每一位值,在64字符中所對應(yīng)的字符 foreach ($_dec as &$v) { $v=$base[$v]; } $desc = array_merge($desc,$_dec); } //每60個(gè)編碼輸出(相當(dāng)于45個(gè)輸入字節(jié))將輸出為獨(dú)立的一行,每行的開頭會加上長度字符,除了最后一行之外,長度字符都應(yīng)該是'h'這個(gè)ASCII字符(45),最后一行的長度字符為剩下的字節(jié)數(shù)目,在64字符中對應(yīng)字符。 $abyte = 60; $crlf = "\r\n"; $alen = count($desc); $anum = floor($alen/$abyte); $amod = ($alen%$abyte); $adesc = array(); for ($i=0;$i<$anum;$i++) { $adesc[]='h'.implode('',array_slice($desc,$i*$abyte,$abyte)).$crlf; } ///截取后面剩余數(shù)組長度 if($amod!==0) { ///以下計(jì)算不滿45字節(jié)編碼情況 $adesc[]=$base[$amod/4*$lbyte+($smod?$smod-$lbyte:$smod)].implode('',array_slice($desc,-$amod)).$crlf; } return implode('',$adesc); }
以上代碼從uuencode編碼做簡單修改而來,基本上去掉+32一些地方。知道編碼原理,其實(shí)我們很容易實(shí)現(xiàn)uuencode->xxencode轉(zhuǎn)換的
以上轉(zhuǎn)換后結(jié)果,與專業(yè)轉(zhuǎn)換工具一致的。好了,通過學(xué)習(xí)這類用可打印字符表示二進(jìn)制字節(jié)的編碼方法。我們可以發(fā)現(xiàn)很多有趣東西!對應(yīng)以后我們?nèi)绻鲎约旱木幋a轉(zhuǎn)換,可以給我們很多借鑒!歡迎朋友們給出自己的意見!
相關(guān)文章
趣談Unicode、Ascii、utf-8、GB2312、GBK等編碼知識
這篇文章主要介紹了趣談Unicode、Ascii、utf-8、GB2312、GBK等編碼知識,文章寫的詼諧風(fēng)趣,膜拜啊,需要的朋友可以參考下2014-07-07使用Visual Studio進(jìn)行文件差異比較的問題小結(jié)
這篇文章主要介紹了使用Visual Studio進(jìn)行文件差異比較,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07解決Chrome在新版MacOS上報(bào)錯(cuò) NET::ERR_CERT_WEAK_KEY 的問題
這篇文章主要介紹了解決Chrome在新版MacOS上報(bào)錯(cuò) NET::ERR_CERT_WEAK_KEY 的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05RabbitMQ隊(duì)列中間件消息持久化?確認(rèn)機(jī)制?死信隊(duì)列原理
這篇文章主要介紹了消息隊(duì)列中間件之RabbitMQ消息的持久化、確認(rèn)機(jī)制、死信隊(duì)列原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Deepin20安裝開發(fā)環(huán)境的超詳細(xì)教程
這篇文章主要介紹了Deepin20安裝開發(fā)環(huán)境的步驟詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10微信應(yīng)用號(小程序)入門安裝教程及IDE(破解版)下載
這篇文章主要介紹了微信應(yīng)用號(小程序)入門安裝教程及IDE下載的相關(guān)資料,需要的朋友可以參考下2016-09-09基于Python和Java實(shí)現(xiàn)單詞計(jì)數(shù)(Word Count)
Spark框架也是MapReduce-like模型,采用“分治-聚合”策略來對數(shù)據(jù)分布進(jìn)行分布并行處理,本文就來利用Spark實(shí)現(xiàn)單詞統(tǒng)計(jì)的功能,需要的可以參考一下2023-05-05會員下線加積分,實(shí)現(xiàn)原理分享(有時(shí)間限制)
當(dāng)某個(gè)用戶發(fā)出一個(gè)邀請后,另一個(gè)用戶通過這個(gè)鏈接進(jìn)行網(wǎng)站后,為發(fā)這個(gè)鏈接的用戶加10個(gè)積分。2011-09-09Keil?uVision5?5.38官方下載、安裝及注冊超詳細(xì)圖文教程
這篇文章主要介紹了Keil?uVision5?5.38官方下載、安裝及注冊教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03