• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            kenlistian

            厚積薄發. 勤為槳,思為帆

               :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理 ::
              73 隨筆 :: 4 文章 :: 22 評論 :: 0 Trackbacks

            Base64 編碼和解碼,

            說到Base64編碼和解碼,不過就是把3個字節進行處理后放置到4個字節空間。其原理就是:

                待編碼數據,以3個字節為單位,依次取6位數據并在前面補上兩個0形成新的8位編碼,

            由于3*8=4*6,這樣3個字節的輸入會變成4個字節的輸出,長度上增加了1/3。

                以上處理存在著字符不是可見字符,故需制定了一個編碼表來轉換。碼表大小為2^6=64,故稱之Base64。

                                        Base64編碼表

                  Value Encoding  Value Encoding  Value Encoding  Value Encoding
                       0 A            17 R            34 i            51 z
                       1 B            18 S            35 j            52 0
                       2 C            19 T            36 k            53 1
                       3 D            20 U            37 l            54 2
                       4 E            21 V            38 m            55 3
                       5 F            22 W            39 n            56 4
                       6 G            23 X            40 o            57 5
                       7 H            24 Y            41 p            58 6
                       8 I            25 Z            42 q            59 7
                       9 J            26 a            43 r            60 8
                      10 K            27 b            44 s            61 9
                      11 L            28 c            45 t            62 +
                      12 M            29 d            46 u            63 /
                      13 N            30 e            47 v
                      14 O            31 f            48 w         (填充符pad) =
                      15 P            32 g            49 x
                      16 Q            33 h            50 y

            摘錄處理代碼如下:

            注意的是,一般在vc下編程漢字編碼都是ansi,如果用到unicon or utf-8的話,注意其細節編碼的處理。

            可能考慮用以WideCharToMultiByte來處理。以下編碼則是在ansi編碼原則下的源碼。

              1 const  char EnBase64Tab[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
              2 const  char DeBase64Tab[] =
              3 {
              4     000000000000000000000000,
              5     0000000000000000000,
              6     62,        // '+'
              7     000,
              8     63,        // '/'
              9     52535455565758596061,        // '0'-'9'
             10     0000000,
             11     0123456789101112,
             12     13141516171819202122232425,        // 'A'-'Z'
             13     000000,
             14     26272829303132333435363738,
             15     39404142434445464748495051,        // 'a'-'z'
             16 };
             17 
             18 int   EncodeBase64(const unsigned char* pSrc, char* pDst, int nSrcLen)
             19 {
             20     unsigned char c1, c2, c3;    // 輸入緩沖區讀出3個字節
             21     int nDstLen = 0;             // 輸出的字符計數
             22     int nLineLen = 0;            // 輸出的行長度計數
             23     int nDiv = nSrcLen / 3;      // 輸入數據長度除以3得到的倍數
             24     int nMod = nSrcLen % 3;      // 輸入數據長度除以3得到的余數
             25     // 每次取3個字節,編碼成4個字符
             26     for (int i = 0; i < nDiv; i ++)
             27     {
             28         // 取3個字節
             29         c1 = *pSrc++;
             30         c2 = *pSrc++;
             31         c3 = *pSrc++;
             32         // 編碼成4個字符
             33         *pDst++ = EnBase64Tab[c1 >> 2];
             34         *pDst++ = EnBase64Tab[((c1 << 4| (c2 >> 4)) & 0x3f];
             35         *pDst++ = EnBase64Tab[((c2 << 2| (c3 >> 6)) & 0x3f];
             36         *pDst++ = EnBase64Tab[c3 & 0x3f];
             37         nLineLen += 4;
             38         nDstLen += 4;
             39     }
             40     // 編碼余下的字節
             41     if (nMod == 1)
             42     {
             43         c1 = *pSrc++;
             44         *pDst++ = EnBase64Tab[(c1 & 0xfc>> 2];
             45         *pDst++ = EnBase64Tab[((c1 & 0x03<< 4)];
             46         *pDst++ = '=';
             47         *pDst++ = '=';
             48         nLineLen += 4;
             49         nDstLen += 4;
             50     }
             51     else if (nMod == 2)
             52     {
             53         c1 = *pSrc++;
             54         c2 = *pSrc++;
             55         *pDst++ = EnBase64Tab[(c1 & 0xfc>> 2];
             56         *pDst++ = EnBase64Tab[((c1 & 0x03<< 4| ((c2 & 0xf0>> 4)];
             57         *pDst++ = EnBase64Tab[((c2 & 0x0f<< 2)];
             58         *pDst++ = '=';
             59         nDstLen += 4;
             60     }
             61     // 輸出加個結束符
             62     *pDst = '\0';
             63     return nDstLen;
             64 }
             65 
             66 //Base64解碼方法中,最簡單的也是查表法:將64個可打印字符的值作為索引,查表得到的值(范圍為0-63)依次連起來,
             67 
             68 //拼湊成字節形式輸出,就得到解碼結果。
             69 int   DecodeBase64(const char* pSrc, unsigned char* pDst, int nSrcLen)
             70 {
             71     int nDstLen;            // 輸出的字符計數
             72     int nValue;             // 解碼用到的長整數
             73     int i;
             74     i = 0;
             75     nDstLen = 0;
             76     // 取4個字符,解碼到一個長整數,再經過移位得到3個字節
             77     while (i < nSrcLen)
             78     {
             79         if (*pSrc != '\r' && *pSrc!='\n')
             80         {
             81             nValue = DeBase64Tab[*pSrc++<< 18;
             82             nValue += DeBase64Tab[*pSrc++<< 12;
             83             *pDst++ = (nValue & 0x00ff0000>> 16;
             84             nDstLen++;
             85             if (*pSrc != '=')
             86             {
             87                 nValue += DeBase64Tab[*pSrc++<< 6;
             88                 *pDst++ = (nValue & 0x0000ff00>> 8;
             89                 nDstLen++;
             90                 if (*pSrc != '=')
             91                 {
             92                     nValue += DeBase64Tab[*pSrc++];
             93                     *pDst++ =nValue & 0x000000ff;
             94                     nDstLen++;
             95                 }
             96             }
             97             i += 4;
             98         }
             99         else        // 回車換行,跳過
            100         {
            101             pSrc++;
            102             i++;
            103         }
            104      }
            105     // 輸出加個結束符
            106     *pDst = '\0';
            107     return nDstLen;
            108 }

            posted on 2008-04-23 12:06 kenlistian 閱讀(814) 評論(0)  編輯 收藏 引用 所屬分類: cpp
            色综合久久中文字幕无码 | 欧美亚洲国产精品久久高清| 久久99精品久久久久久齐齐| 青青热久久国产久精品| 色偷偷88888欧美精品久久久| 久久精品国产91久久综合麻豆自制 | 久久久久亚洲精品无码网址| 欧美日韩精品久久久久| 久久久青草青青亚洲国产免观| 久久亚洲中文字幕精品一区四| 久久99精品国产自在现线小黄鸭| 国内精品久久久久久久涩爱 | 天天躁日日躁狠狠久久 | 久久久久久久精品成人热色戒| 青青青青久久精品国产| 色婷婷综合久久久久中文一区二区| 国产精品综合久久第一页| 久久中文骚妇内射| 一本久久精品一区二区| 久久久久无码国产精品不卡| 99久久99久久精品免费看蜜桃| 99精品国产99久久久久久97 | 国产精品久久久99| 97久久精品午夜一区二区| 亚洲AV日韩精品久久久久| 久久久久久亚洲精品影院| 国产亚洲成人久久| 51久久夜色精品国产| 狠狠色婷婷综合天天久久丁香 | 中文字幕亚洲综合久久菠萝蜜| 国产成人久久精品麻豆一区| 91精品国产91热久久久久福利| 精品999久久久久久中文字幕| 国产国产成人精品久久| 99久久久国产精品免费无卡顿| 国产成人久久精品激情| 狠狠色婷婷综合天天久久丁香 | 久久久国产精品亚洲一区| 日产精品久久久久久久| 97热久久免费频精品99| 99久久精品费精品国产 |