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

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

 更新時(shí)間:2016年06月04日 21:29:06   作者:程默  
這篇文章主要介紹了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
字符串:'Cat‘ 編碼后是:Eq3O

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)文章

  • SSO單點(diǎn)登錄和OAuth2.0區(qū)別小結(jié)

    SSO單點(diǎn)登錄和OAuth2.0區(qū)別小結(jié)

    很多時(shí)候我們會使用單點(diǎn)登錄SSO或者OAuth2.0等身份驗(yàn)證和授權(quán)來實(shí)現(xiàn)登錄,本文主要介紹了SSO單點(diǎn)登錄和OAuth2.0區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 趣談Unicode、Ascii、utf-8、GB2312、GBK等編碼知識

    趣談Unicode、Ascii、utf-8、GB2312、GBK等編碼知識

    這篇文章主要介紹了趣談Unicode、Ascii、utf-8、GB2312、GBK等編碼知識,文章寫的詼諧風(fēng)趣,膜拜啊,需要的朋友可以參考下
    2014-07-07
  • Vscode中l(wèi)aunch.json與tasks.json文件的詳細(xì)介紹

    Vscode中l(wèi)aunch.json與tasks.json文件的詳細(xì)介紹

    在VSCode中,launch.json和tasks.json作為兩個(gè)重要的配置文件,能夠幫助開發(fā)者實(shí)現(xiàn)調(diào)試和任務(wù)運(yùn)行的自動(dòng)化配置,下面這篇文章主要給大家介紹了關(guān)于Vscode中l(wèi)aunch.json與tasks.json文件的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • GCC?指令詳解及動(dòng)態(tài)庫、靜態(tài)庫的使用方法

    GCC?指令詳解及動(dòng)態(tài)庫、靜態(tài)庫的使用方法

    GCC?是?Linux?下的編譯工具集,是「GNU?Compiler?Collection」的縮寫,包含?gcc、g++?等編譯器,這篇文章主要介紹了GCC?指令詳解及動(dòng)態(tài)庫、靜態(tài)庫的使用,需要的朋友可以參考下
    2022-10-10
  • Webpack基礎(chǔ)教程之名詞解釋

    Webpack基礎(chǔ)教程之名詞解釋

    webpack 是一個(gè)現(xiàn)代JavaScript 應(yīng)用程序的靜態(tài)模塊打包器,這次為大家簡單介紹一下webpack及關(guān)于webpack的一些專屬名詞入口(entry),輸出(output),loader,插件(plugins)
    2020-02-02
  • Git常用命令匯總

    Git常用命令匯總

    Git是一個(gè)開源的分布式版本控制系統(tǒng),可以有效、高速地處理從很小到非常大的項(xiàng)目版本管理。這篇文章介紹了Git的常用命令,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 一文學(xué)會Hadoop與Spark等大數(shù)據(jù)框架知識

    一文學(xué)會Hadoop與Spark等大數(shù)據(jù)框架知識

    Hadoop是一個(gè)開源的可運(yùn)行于大規(guī)模集群上的分布式文件系統(tǒng)和運(yùn)行處理基礎(chǔ)框架,Spark是UC Berkeley?AMPLab開發(fā)的是一種計(jì)算框架,分布式資源工作交由集群管理軟件(Mesos、YARN),本文介紹Hadoop與Spark大數(shù)據(jù)框架知識,感興趣的朋友一起看看吧
    2022-04-04
  • 軟件測試面試如何測試一個(gè)杯子

    軟件測試面試如何測試一個(gè)杯子

    本文主要介紹軟件測試面試如何測試一個(gè)杯子,這里幫大家整理了詳細(xì)的面試資料,和面試需要準(zhǔn)備的知識點(diǎn),有興趣的小伙伴可以參考下
    2016-08-08
  • 一文詳解軟件測試需求分析是什么

    一文詳解軟件測試需求分析是什么

    需求分析是掌握被測系統(tǒng)的過程,一般測試和開發(fā)人員都要進(jìn)行需求分析,測試方做的需求分析稱為測試需求分析,這篇文章主要給大家介紹了關(guān)于軟件測試需求分析的相關(guān)資料,需要的朋友可以參考下
    2007-04-04
  • 基于 Dubbo Admin 動(dòng)態(tài)調(diào)整服務(wù)超時(shí)時(shí)間的操作步驟

    基于 Dubbo Admin 動(dòng)態(tài)調(diào)整服務(wù)超時(shí)時(shí)間的操作步驟

    Dubbo提供動(dòng)態(tài)調(diào)整超時(shí)時(shí)間的服務(wù)治理能力,可以在無需重啟應(yīng)用的情況下,動(dòng)態(tài)調(diào)整服務(wù)超時(shí)時(shí)間,這篇文章主要介紹了基于 Dubbo Admin 動(dòng)態(tài)調(diào)整服務(wù)超時(shí)時(shí)間,需要的朋友可以參考下
    2022-12-12

最新評論

栾城县| 伊川县| 上虞市| 阿合奇县| 元氏县| 绍兴县| 石泉县| 临高县| 比如县| 张家界市| 福贡县| 堆龙德庆县| 长岭县| 花莲市| 金门县| 嘉峪关市| 马公市| 衢州市| 韩城市| 西藏| 紫云| 白玉县| 博乐市| 大庆市| 麦盖提县| 江源县| 锡林郭勒盟| 微博| 吉木萨尔县| 贵德县| 广水市| 峨边| 竹山县| 中宁县| 浦江县| 宁武县| 仲巴县| 南乐县| 澳门| 来安县| 镇赉县|