亂碼演算法大全(一)Uuencode (轉)

gugu99發表於2008-06-24
亂碼演算法大全(一)Uuencode (轉)[@more@] 

  相信上過網的朋友們都遇見過“亂碼”,也就是在瀏覽網頁或看E時出現的不能辨認的字元。以前也有許多的文章介紹過“亂碼”,不過他們的文章只是講怎樣辨別和怎樣用工具解碼,並沒有詳細介紹各種編碼的演算法的實現,本文將對網際網路上最常用的幾種編碼的編碼和解碼演算法作以詳細的闡述。希望對想了解“亂碼”演算法或想在自己中實現這些功能朋友們有一些參考價值。本文的源程式用C語言寫成,形式為,可直接使用。:namespace prefix = o ns = "urn:schemas--com::office" />

Uuencode:

  Uuencode 是將二進位制以文字檔案方式進行編碼表示、以利於基於文字傳輸環境中進行二進位制檔案的傳輸/的編碼方法之一, 在/二進位制新聞組中使用頻率比較高,經常用於 Attach 二進位制檔案。

  這種編碼的特徵是:每一行開頭用“M”標誌。下面是我做的一個測試用的檔案mogao.txt,編碼為Uuencode:

begin 644 mogao.txt

M"0D)("`@(*&VPM+"ZOCMZBTBKH;

MU]6^HZAT96QN970Z+RR,#(N,3$R+C(P+C$S,CHR,Z.ILG4L:&0H)("`@

M("`@Q*JXWCMO/ZYI-?WRM*CN='`Z+R]M;V=A;RYB96YT:75N+FYE=`T*

M"0D)16UA:6QT;SIM;V=A;T`S-S$N;F5T#0H)("`@*BHJ*BHJ*BHJ*BHJ*BHJ

M*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ("`@("`@("`@("`@("`@

M#0H)("`@*B"S_

MN'TS(J#0H)("`@*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ

,*BHJ*BHJ*BHJ*BHJ

`

end

 

  你可以把它單獨存成一個檔案:mogao.uue,然後用開啟,解壓即得mogao.txt。

  Uuencode的演算法很簡單,編碼時它將3個字元順序放入一個 24 位的緩衝區,缺字元的地方補零,然後將緩衝區截斷成為 4 個部分,高位在先,每個部分 6 位,用下面的64個字元重新表示:

"`!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_"

在檔案的開頭有“begin xxx 被編碼的檔名”,在檔案的結尾有“end”,用來標誌Uue檔案的開始和結束。編碼時,每次讀取原始檔的45個字元,不足45個的用“NULL”補足為3的整數倍(如:23補為24),然後輸入目標檔案一個ASCII為:“32+實際讀取的字元數”的字元作為每一行的開始。讀取的字元編碼後輸入目標檔案,再輸入一個“換行符”。如果原始檔被編碼完了,那麼輸入“`(ASCII為96)”和一個“換行符”表示編碼結束。

  解碼時它將4個字元分別轉換為4個6位字元後,擷取有用的後六位放入一個 24 位的緩衝區,即得3個二進位制程式碼。

  下面我給出Uuencode編碼和解碼的C語言描述:

/*Uuencode編碼*/

void Uue(unsigned char chasc[3],unsigned char chuue[4])

/* 

chasc:未編碼的二進位制程式碼

chuue:編碼過的Uue程式碼

*/

{int i,k=2;

 unsigned char t=NULL;

 for(i=0;i<3;i++)

 {*(chuue+i)=*(chasc+i)>>k;

  *(chuue+i)|=t;

  if(*(chuue+i)==NULL) *(chuue+i)+=96;

  else *(chuue+i)+=32;

  t=*(chasc+i)<

  t>>=2;

  k+=2;

 }

 *(chuue+3)=*(chasc+2)&63;

 if(*(chuue+3)==NULL) *(chuue+3)+=96;

 else *(chuue+3)+=32;

}

 

/*Uuencode解碼*/

void unUue(unsigned char chuue[4],unsigned char chasc[3])

/* 

chuue:未解碼的Uue程式碼

chasc:解碼過的二進位制程式碼

*/

{int i,k=2;

 unsigned char t=NULL;

 if(*chuue==96) *chuue=NULL;

 else *chuue-=32;

 for(i=0;i<3;i++)

 {*(chasc+i)=*(chuue+i)<

  k+=2;

  if(*(chuue+i+1)==96) *(chuue+i+1)=NULL;

  else *(chuue+i+1)-=32;

  t=*(chuue+i+1)>>8-k;

  *(chasc+i)|=t;

 }

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1006055/,如需轉載,請註明出處,否則將追究法律責任。

相關文章