国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
亂碼算法大全

    相信上過網(wǎng)的朋友們都遇見過“亂碼”,也就是在瀏覽網(wǎng)頁或看Email時(shí)出現(xiàn)的不能辨認(rèn)的字符。以前也有許多的文章介紹過“亂碼”,不過他們的文章只是講怎樣辨別和怎樣用工具解碼,并沒有詳細(xì)介紹各種編碼的算法的實(shí)現(xiàn),本文將對(duì)互聯(lián)網(wǎng)上最常用的幾種編碼的編碼和解碼算法作以詳細(xì)的闡述。希望對(duì)想了解“亂碼”算法或想在自己程序中實(shí)現(xiàn)這些功能朋友們有一些參考價(jià)值。本文的源程序用C語言寫成,形式為函數(shù),可直接使用。

一. 常用編碼
1. Uuencode
    Uuencode 是將二進(jìn)制文件以文本文件方式進(jìn)行編碼表示、以利于基于文本傳輸環(huán)境中進(jìn)行二進(jìn)制文件的傳輸/交換的編碼方法之一, 在郵件系統(tǒng)/二進(jìn)制新聞組中使用頻率比較高,經(jīng)常用于 Attach 二進(jìn)制文件。
    這種編碼的特征是:每一行開頭用“M”標(biāo)志。下面是我做的一個(gè)測(cè)試用的文件mogao.txt,編碼為Uuencode:
begin 644 mogao.txt
M"0D)("`@(*&VPM+"Z\OCMZBT\\BKH;<-"@G7]]7?.FUO9V%OHZRPU]3&N\:Z
MU]6^HZAT96QN970Z+R\R,#(N,3$R+C(P+C$S,CHR,Z.IL\G4L:&C#0H)("`@
M("`@Q*JXW\CMO/ZYI-?WRM*CNFAT=‘`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_<‘+O,?2Y,JRP[2VO+*[M/C7WZ.LL_W!R]?CO*/*LL.TMKRR
MN\‘TS\(J#0H)("`@*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ*BHJ
,*BHJ*BHJ*BHJ*BHJ
`
end

    你可以把它單獨(dú)存成一個(gè)文件:mogao.uue,然后用Winzip打開,解壓即得mogao.txt。
    Uuencode的算法很簡(jiǎn)單,編碼時(shí)它將3個(gè)字符順序放入一個(gè) 24 位的緩沖區(qū),缺字符的地方補(bǔ)零,然后將緩沖區(qū)截?cái)喑蔀?4 個(gè)部分,高位在先,每個(gè)部分 6 位,用下面的64個(gè)字符重新表示:
"`!"#$%&‘()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_"
在文件的開頭有“begin xxx 被編碼的文件名”,在文件的結(jié)尾有“end”,用來標(biāo)志Uue文件的開始和結(jié)束。編碼時(shí),每次讀取源文件的45個(gè)字符,不足45個(gè)的用“NULL”補(bǔ)足為3的整數(shù)倍(如:23補(bǔ)為24),然后輸入目標(biāo)文件一個(gè)ASCII為:“32+實(shí)際讀取的字符數(shù)”的字符作為每一行的開始。讀取的字符編碼后輸入目標(biāo)文件,再輸入一個(gè)“換行符”。如果源文件被編碼完了,那么輸入“`(ASCII為96)”和一個(gè)“換行符”表示編碼結(jié)束。
    解碼時(shí)它將4個(gè)字符分別轉(zhuǎn)換為4個(gè)6位字符后,截取有用的后六位放入一個(gè) 24 位的緩沖區(qū),即得3個(gè)二進(jìn)制代碼。
    下面我給出Uuencode編碼和解碼的C語言描述:
/*Uuencode編碼*/
void Uue(unsigned char chasc[3],unsigned char chuue[4])
/* 
chasc:未編碼的二進(jìn)制代碼
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)<<(8-k);
  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:解碼過的二進(jìn)制代碼
*/
{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;
  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;
 }
}

2. Xxencode
    提到Uuencode不可能不提Xxencode, Xxencode的編碼算法和 Uuencode基本相同,但是使用的是不同的字符集。XxEncode編碼使用的字符是:
“+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz”與 Uuencode 相比,它的特殊字符更少。很多支持 Uuencode 編解碼的工具都同時(shí)支持 Xxencode。
    這種編碼的特征是:每一行開頭用“h”標(biāo)志。下面是Xxencode的一個(gè)例子:
begin 644 mogao.txt
h0EY760+U684qkh90uwjXhuWowwWfcPQB0UbLxxLTCapjNq3jcumkpxH4iwOu
hpxKycuVoNKliNLEu9mwmA16iAH2m9X6k9X2nAXcmAuCdgwbIgO4X1Ec760+U
h60+Ul8esrwXhjDutdBTrmh8XiaVoR5+u9mxhPqRVPmtWNKtoOLJi9atZR+o8
h0EY7FKpVOKloPndhPqRVPo+nBn2iPaJo1Ec760+U8Wce8Wce8Wce8Wce8Wce
h8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce60+U60+U60+U60+U60+U
h1Ec760+U8W0nzQ59jATGtAemkvGqj98vhDXLruCggzr-mxTXj8D8ggCohfmm
hiw5onw6e1Ec760+U8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce8Wce
A8Wce8Wce8Wce8Wce
+
end

    你可以把它單獨(dú)存成一個(gè)文件:mogao.xxe,然后用Winzip打開,解壓即得mogao.txt。
    Xxencode的編碼算法和Uuencode基本相同,實(shí)現(xiàn)起來則更為簡(jiǎn)單,在此就不詳述了。
    下面給出Xxencode編碼和解碼的C語言描述:
/*Xxencode編碼*/
 void Xxe(unsigned char chasc[3],unsigned char chxxe[4])
/*
chasc:未編碼的二進(jìn)制代碼
chxxe:編碼過的Xxe代碼
*/
{int i;
 static char set[]=
  "+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 chxxe[0]=chasc[0]>>2;
 chxxe[1]=(chasc[0]<<4)&48|(chasc[1]>>4)&15;
 chxxe[2]=(chasc[1]<<2)&60|(chasc[2]>>6)&3;
 chxxe[3]=chasc[2]&63;
 for(i=0;i<4;i++) chxxe[i]=set[chxxe[i]];   /*查表*/
}
/*需注意的是,Xxencode文件正文部分中每一行的第一個(gè)字母是:從源文件中實(shí)際                 讀取的字符數(shù)的ASCII值取后六位后用set[]查表得到的。*/
/*Xxencode解碼*/
unsigned char set(unsigned char ch)    /*查表函數(shù)*/
{if(ch==43) ch=0;
 else if(ch==45) ch=1;
 else if(ch>=48&&ch<=57) ch-=46;
 else if(ch>=65&&ch<=90) ch-=53;
 else if(ch>=97&&ch<=122) ch-=59;
 return ch;
}

void unXxe(unsigned char chxxe[4],unsigned char chasc[3])
/*
chxxe:未解碼的Xxe代碼
chasc:解碼過的二進(jìn)制代碼
*/
{int k=2 ,i;
 unsigned char t;
 t=NULL;
 *chxxe=set(*chxxe);
 for(i=0;i<3;i++)
 {*(chxxe+i+1)=set(*(chxxe+i+1));
  (chhex+i)=*(chxxe+i)<<k;
  k+=2;
  t=*(chxxe+i+1)>>8-k;
  *(chhex+i)|=t;
 }
}

3. Base64
    Base64和下面將要介紹的Quoted-Printable都屬于MIME(多部分( multi-part)、多媒體電子郵件和 WWW 超文本的一種編碼標(biāo)準(zhǔn),用于傳送諸如圖形、聲音和傳真等非文本數(shù)據(jù))。MIME定義在RFC1341中。
    Base64是現(xiàn)今在互聯(lián)網(wǎng)上應(yīng)用最多的一種編碼,幾乎所有的電子郵件軟件頭把它作為默認(rèn)的二進(jìn)制編碼,它已經(jīng)成了現(xiàn)今電子郵件編碼的代名詞。
    下面是Base64的一個(gè)例子,從例子中,您也可以看到Base64與電子郵件的的緊密聯(lián)系:
Content-Type: text/plain;charset="cn-gb"
Content-Transfer-Encoding: BASE64

CQkJICAgIKG2wtLC68vjt6i088irobcNCgnX99XfOm1vZ2Fvo6yw19TGu8a619W+o6h0ZWxuZXQ6
Ly8yMDIuMTEyLjIwLjEzMjoyM6Ops8nUsaGjDQoJICAgICAgxKq438jtvP65pNf3ytKjumh0dHA6
Ly9tb2dhby5iZW50aXVuLm5ldA0KCQkJRW1haWx0bzptb2dhb0AzNzEubmV0DQoJICAgKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgICAgICAgICAgDQoJ
ICAgKiCz/cHLvMfS5Mqyw7S2vLK7tPjX36Oss/3By9fjvKPKssO0tryyu8H0z8IqDQoJICAgKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq

    你可以把它單獨(dú)存成一個(gè)文件,可以取名為:mogao.eml,雙擊可以用OutLook打開(前兩行為郵件的原始信息,從第四行開始為編碼內(nèi)容)。
    Base64的算法同Uuencode的算法很接近,也很簡(jiǎn)單:它將字符流順序放入一個(gè) 24 位的緩沖區(qū),缺字符的地方補(bǔ)零。然后將緩沖區(qū)截?cái)喑蔀?4 個(gè)部分,高位在先,每個(gè)部分 6 位,用下面的64個(gè)字符重新表示:“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”。如果輸入只有一個(gè)或兩個(gè)字節(jié),那么輸出將用等號(hào)“=”補(bǔ)足。這可以隔斷附加的信息造成編碼的混亂。它每行一般為76個(gè)字符。
    下面我給出Base64的編碼和解碼的C語言描述:
/*Base64編碼*/
void Base64(unsigned char chasc[3],unsigned char chuue[4])
/* 
  chasc:未編碼的二進(jìn)制代碼
  chuue:編碼過的Base64代碼
*/
{
 int i,k=2;
 unsinged char t=NULL;
 for(i=0;i<3;i++)
 {
  *(chuue+i)=*(chasc+i)>>k;
  *(chuue+i)|=t;
  t=*(chasc+i)<<(8-k);
  t>>=2;
  k+=2;
 }
 *(chuue+3)=*(chasc+2)&63;

 for(i=0;i<4;i++)
    if((*(chuue+i)>=0)&&(*(chuue+i)<=25)) *(chuue+i)+=65;
    else if((*(chuue+i)>=26)&&(*(chuue+i)<=51)) *(chuue+i)+=71;
    else if((*(chuue+i)>=52)&&(*(chuue+i)<=61)) *(chuue+i)-=4;
    else if(*(chuue+i)==62) *(chuue+i)=43;
    else if(*(chuue+i)==63) *(chuue+i)=47;

}
/*Base64解碼*/
void unBase64(unsigned char chuue[4],unsigned char chasc[3])
/* 
chuue:未解碼的Base64代碼
chasc:解碼過的二進(jìn)制代碼
*/
{int i,k=2;
 unsigned char t=NULL;
 
 for(i=0;i<4;i++)
     if((*(chuue+i)>=65)&&(*(chuue+i)<=90)) *(chuue+i)-=65;
     else if((*(chuue+i)>=97)&&(*(chuue+i)<=122)) *(chuue+i)-=71;
     else if((*(chuue+i)>=48)&&(*(chuue+i)<=57)) *(chuue+i)+=4;
     else if(*(chuue+i)==43) *(chuue+i)=62;
     else if(*(chuue+i)==47) *(chuue+i)=63;
     else if(*(chuue+i)==61) *(chuue+i)=0;

 for(i=0;i<3;i++)
 {*(chhex+i)=*(chuue+i)<<k;
  k+=2;
  t=*(chuue+i+1)>>8-k;
  *(chhex+i)|=t;
 }
}

4. Quoted-Printable
    Quoted-Printable簡(jiǎn)稱QP, 一般用在Email系統(tǒng)中。它通常用于少量文本方式的8位字符的編碼,例如Foxmail就用它做對(duì)主題和信體的編碼。這種編碼的應(yīng)該是很好辨認(rèn)的:它有大量的“=”。下面是它的一個(gè)例子:

Mime-Version: 1.0
Content-Transfer-Encoding: quoted-printable

       =A1=B6=C2=D2=C2=EB=CB=E3=B7=A8=B4=F3=C8=AB=A1=B7
 =D7=F7=D5=DF:mogao=A3=AC=B0=D7=D4=C6=BB=C6=BA=D7=D5=BE=A3=A8telnet://202.112.20.132:23=A3=A9=B3=C9=D4=B1=A1=A3
       =C4=AA=B8=DF=C8=ED=BC=FE=B9=A4=D7=F7=CA=D2=A3=BAhttp://mogao.bentiun.net
   Emailto:mogao@371.net
    *********************************************              
    * =B3=FD=C1=CB=BC=C7=D2=E4=CA=B2=C3=B4=B6=BC=B2=BB=B4=F8=D7=DF=A3=AC=B3=FD=C1=CB=D7=E3=BC=A3=CA=B2=C3=B4=B6=BC=B2=BB=C1=F4=CF=C2*
    *********************************************

    你可以把它單獨(dú)存成一個(gè)文件,取名為:mogao.eml,雙擊可以用OutLook打開(前兩行為郵件的原始信息,從第四行開始為編碼內(nèi)容)。
    QP的算法可以說是最簡(jiǎn)單的也可以說是編碼效率最低的(它的編碼率是1:3),它是專門為了處理8位字符制定的。它的算法是:讀一個(gè)字符,如果ASCII碼大于127,即字符的第8位是1的話,進(jìn)行編碼,否則忽略(有時(shí)也對(duì)7位字符編碼)。編碼很簡(jiǎn)單,看下面的C語言描述即可:
/*QP編碼*/
void qp(unsigned char sour,unsigned char first,unsigned char second)
/* 
  sour:要編碼的字符
  first:編碼后的第一個(gè)字符
   second:編碼后的第二個(gè)字符
  first和second為返回值
*/
{
 if(sour>127)  
 {first=sour>>4;
  second=sour&15;
  if(first>9) first+=55;
  else first+=48;
  if(second>9) second+=55;
  else second+=48;
  printf("%c%c%c",‘=‘,first,second);
 }
}

/*QP解碼*/
void uqp(unsigned char sour,unsigned char first,unsigned char second)
/*
  sour:解碼后的字符
  first:QP碼的第一個(gè)字符
   second:QP碼的第二個(gè)字符
  sour為返回值
*/
{
 if(first>=65) first-=55;
 else first-=48;
 if(second>=65) second-=55;
 else second-=48;
 sour=NULL;
 sour=first<<4;
 sour|=second;
}

    現(xiàn)在大家知道為什么QP的編碼率那么低了吧!關(guān)于QP的詳細(xì)說明和準(zhǔn)確定義可以參閱RFC2045。

二.漢字編碼
1. GB碼和Big5碼
    GB碼是中國(guó)大陸、新加坡等國(guó)家和地區(qū)使用的一種漢字編碼方法。Big5碼是中國(guó)臺(tái)灣省用的一種漢字編碼方法。它們的編碼方法是完全不同的兩種方法,它們之間的轉(zhuǎn)換只能通過“查表法”來進(jìn)行。所以說轉(zhuǎn)換的方法很簡(jiǎn)單,困難的是“表”的生成。很多文章對(duì)此都做過介紹,我在此就不詳述了。在我的主頁上有我寫的“漢字轉(zhuǎn)碼通V1.0”的源程序,其中有這兩個(gè)“表”,可以直接使用。

2. HZ碼
    HZ碼是為了使只能傳送7bit信息的郵件服務(wù)器或網(wǎng)關(guān)能傳送8bit信息而定義的編碼,也是中文常用編碼的一種。它和上面介紹的Quoted-Printable碼都只能對(duì)文本進(jìn)行編碼,即編碼時(shí)忽略控制字符。
    這種編碼的也是很好辨認(rèn)的:有許多“~{”和“~}”,而且總是成對(duì)出現(xiàn)。下面是HZ碼的一個(gè)例子:
       ~{!6BRBkKc7(4sH+!7~}
 ~{WwU_~}:mogao~{#,0WTF;F:WU>#(~}telnet://202.112.20.132:23~{#)3IT1!#~}
       ~{D*8_Hm<~9$WwJR#:~}http://mogao.bentiun.net
   Emailto:mogao@371.net
    *********************************************              
    * ~{3}AK<GRdJ2C46<2;4xW_#,3}AKWc<#J2C46<2;AtOB~}*
    *********************************************

    您可以打開“南極星”看這段文字。
    它的算法更簡(jiǎn)單:讀一個(gè)字符,如果是8位字符,就把它的最高位清零。把連續(xù)的8位字符清零后的輸出用“~{”和“~}”括起來。解碼時(shí):把是用“~{”和“~}”括起來的部分每個(gè)字符的第8位置“1”即可。

    上面介紹的三種編碼之間的轉(zhuǎn)換是經(jīng)常遇見的,我寫的“漢字轉(zhuǎn)碼通V1.0”可以方便的在這三種之間轉(zhuǎn)換,我把它的源程序公開,方便廣大網(wǎng)友的學(xué)習(xí)。

三.其他常用編碼
1.  Unicode
    Unicode應(yīng)用中最典型的例子是:IE4以上版本對(duì)HTML的編碼。它可以說是未來Windows下唯一的字符集。但它還很不完善,而且Win95和Win98對(duì)它的支持還很有限,甚至它還沒有一套完整的標(biāo)準(zhǔn)。不過,微軟最新推出的Office2000和馬上就要推出的Windows2000將全面支持Unicode。Unicode取代其他編碼將會(huì)是必然的趨勢(shì)。不過,在近一兩年Unicode并不會(huì)占主導(dǎo)地位,就是在占主導(dǎo)地位后,因?yàn)椴僮飨到y(tǒng)的差異,其他編碼也不會(huì)立即消亡。它的中文資料可以在Office2000和Windows2000所帶的文檔中找到,它的官方網(wǎng)站是:http://www.unicode.org/。

2. Binhex
    BinHex 編碼是 Macintosh 計(jì)算機(jī)(也就是俗稱的“蘋果電腦”)上用可打印字符表示/傳輸二進(jìn)制文件的一種編碼方法。它的主要用途是在電子郵件程序中Attach二進(jìn)制文件。大部分的電子郵件程序不支持這種格式(Eudora支持),但用WINZIP可以進(jìn)行解碼。它的資料請(qǐng)查閱Macintosh計(jì)算機(jī)帶的相關(guān)文檔。


三.總結(jié)
    由于篇幅所限,除了本文介紹的這幾種常用編碼外,還是有很多種編碼的。如各種加密算法產(chǎn)生的“亂碼”(我將在另外一篇文章中詳細(xì)介紹)。本文中提到的所有文檔和源程序在我的主頁中均可下載,我的主頁地址是:http://mogao.bentium.net。如果您對(duì)本文有什么意見請(qǐng)來信商榷,我的E-mail地址是:mogao@371.net。

注:我在本文中使用的例子“mogao.txt”的內(nèi)容是:
       《亂碼算法大全》
 作者:mogao,白云黃鶴站(telnet://202.112.20.132:23)成員。
       莫高軟件工作室:http://mogao.bentiun.net
   Emailto:mogao@371.net
    *********************************************              
    * 除了記憶什么都不帶走,除了足跡什么都不留下*
    *********************************************

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
跨平臺(tái)C++ Base 64 編碼解碼函數(shù)
亂碼大全(23)──XXEncode 和 Btoa
淺談Base64編碼
幫你搞清ASCII、Unicode和UTF-8區(qū)別,拿走不謝
如何消除電子函件的亂碼
二進(jìn)制算法摘錄
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服