乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      亂碼算法大全

       Ralf_Jones 2005-12-30

          相信上過網(wǎng)的朋友們都遇見過“亂碼”,也就是在瀏覽網(wǎng)頁或看Email時出現(xiàn)的不能辨認(rèn)的字符。以前也有許多的文章介紹過“亂碼”,不過他們的文章只是講怎樣辨別和怎樣用工具解碼,并沒有詳細(xì)介紹各種編碼的算法的實現(xiàn),本文將對互聯(lián)網(wǎng)上最常用的幾種編碼的編碼和解碼算法作以詳細(xì)的闡述。希望對想了解“亂碼”算法或想在自己程序中實現(xiàn)這些功能朋友們有一些參考價值。本文的源程序用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)志。下面是我做的一個測試用的文件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

          你可以把它單獨存成一個文件:mogao.uue,然后用Winzip打開,解壓即得mogao.txt。
          Uuencode的算法很簡單,編碼時它將3個字符順序放入一個 24 位的緩沖區(qū),缺字符的地方補零,然后將緩沖區(qū)截斷成為 4 個部分,高位在先,每個部分 6 位,用下面的64個字符重新表示:
      "`!"#$%&‘()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_"
      在文件的開頭有“begin xxx 被編碼的文件名”,在文件的結(jié)尾有“end”,用來標(biāo)志Uue文件的開始和結(jié)束。編碼時,每次讀取源文件的45個字符,不足45個的用“NULL”補足為3的整數(shù)倍(如:23補為24),然后輸入目標(biāo)文件一個ASCII為:“32+實際讀取的字符數(shù)”的字符作為每一行的開始。讀取的字符編碼后輸入目標(biāo)文件,再輸入一個“換行符”。如果源文件被編碼完了,那么輸入“`(ASCII為96)”和一個“換行符”表示編碼結(jié)束。
          解碼時它將4個字符分別轉(zhuǎn)換為4個6位字符后,截取有用的后六位放入一個 24 位的緩沖區(qū),即得3個二進(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 編解碼的工具都同時支持 Xxencode。
          這種編碼的特征是:每一行開頭用“h”標(biāo)志。下面是Xxencode的一個例子:
      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

          你可以把它單獨存成一個文件:mogao.xxe,然后用Winzip打開,解壓即得mogao.txt。
          Xxencode的編碼算法和Uuencode基本相同,實現(xià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文件正文部分中每一行的第一個字母是:從源文件中實際                 讀取的字符數(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的一個例子,從例子中,您也可以看到Base64與電子郵件的的緊密聯(lián)系:
      Content-Type: text/plain;charset="cn-gb"
      Content-Transfer-Encoding: BASE64

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

          你可以把它單獨存成一個文件,可以取名為:mogao.eml,雙擊可以用OutLook打開(前兩行為郵件的原始信息,從第四行開始為編碼內(nèi)容)。
          Base64的算法同Uuencode的算法很接近,也很簡單:它將字符流順序放入一個 24 位的緩沖區(qū),缺字符的地方補零。然后將緩沖區(qū)截斷成為 4 個部分,高位在先,每個部分 6 位,用下面的64個字符重新表示:“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”。如果輸入只有一個或兩個字節(jié),那么輸出將用等號“=”補足。這可以隔斷附加的信息造成編碼的混亂。它每行一般為76個字符。
          下面我給出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簡稱QP, 一般用在Email系統(tǒng)中。它通常用于少量文本方式的8位字符的編碼,例如Foxmail就用它做對主題和信體的編碼。這種編碼的應(yīng)該是很好辨認(rèn)的:它有大量的“=”。下面是它的一個例子:

      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.
         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*
          *********************************************

          你可以把它單獨存成一個文件,取名為:mogao.eml,雙擊可以用OutLook打開(前兩行為郵件的原始信息,從第四行開始為編碼內(nèi)容)。
          QP的算法可以說是最簡單的也可以說是編碼效率最低的(它的編碼率是1:3),它是專門為了處理8位字符制定的。它的算法是:讀一個字符,如果ASCII碼大于127,即字符的第8位是1的話,進(jìn)行編碼,否則忽略(有時也對7位字符編碼)。編碼很簡單,看下面的C語言描述即可:
      /*QP編碼*/
      void qp(unsigned char sour,unsigned char first,unsigned char second)
      /* 
        sour:要編碼的字符
        first:編碼后的第一個字符
         second:編碼后的第二個字符
        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碼的第一個字符
         second:QP碼的第二個字符
        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碼是中國大陸、新加坡等國家和地區(qū)使用的一種漢字編碼方法。Big5碼是中國臺灣省用的一種漢字編碼方法。它們的編碼方法是完全不同的兩種方法,它們之間的轉(zhuǎn)換只能通過“查表法”來進(jìn)行。所以說轉(zhuǎn)換的方法很簡單,困難的是“表”的生成。很多文章對此都做過介紹,我在此就不詳述了。在我的主頁上有我寫的“漢字轉(zhuǎn)碼通V1.0”的源程序,其中有這兩個“表”,可以直接使用。

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

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

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

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

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


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

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

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多