• <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

            厚積薄發(fā). 勤為槳,思為帆

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

            Base64 編碼和解碼,

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

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

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

                以上處理存在著字符不是可見字符,故需制定了一個編碼表來轉(zhuǎn)換。碼表大小為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的話,注意其細節(jié)編碼的處理。

            可能考慮用以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;    // 輸入緩沖區(qū)讀出3個字節(jié)
             21     int nDstLen = 0;             // 輸出的字符計數(shù)
             22     int nLineLen = 0;            // 輸出的行長度計數(shù)
             23     int nDiv = nSrcLen / 3;      // 輸入數(shù)據(jù)長度除以3得到的倍數(shù)
             24     int nMod = nSrcLen % 3;      // 輸入數(shù)據(jù)長度除以3得到的余數(shù)
             25     // 每次取3個字節(jié),編碼成4個字符
             26     for (int i = 0; i < nDiv; i ++)
             27     {
             28         // 取3個字節(jié)
             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     // 編碼余下的字節(jié)
             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     // 輸出加個結(jié)束符
             62     *pDst = '\0';
             63     return nDstLen;
             64 }
             65 
             66 //Base64解碼方法中,最簡單的也是查表法:將64個可打印字符的值作為索引,查表得到的值(范圍為0-63)依次連起來,
             67 
             68 //拼湊成字節(jié)形式輸出,就得到解碼結(jié)果。
             69 int   DecodeBase64(const char* pSrc, unsigned char* pDst, int nSrcLen)
             70 {
             71     int nDstLen;            // 輸出的字符計數(shù)
             72     int nValue;             // 解碼用到的長整數(shù)
             73     int i;
             74     i = 0;
             75     nDstLen = 0;
             76     // 取4個字符,解碼到一個長整數(shù),再經(jīng)過移位得到3個字節(jié)
             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     // 輸出加個結(jié)束符
            106     *pDst = '\0';
            107     return nDstLen;
            108 }

            posted on 2008-04-23 12:06 kenlistian 閱讀(794) 評論(0)  編輯 收藏 引用 所屬分類: cpp
            91精品国产高清久久久久久io| 成人a毛片久久免费播放| 综合人妻久久一区二区精品| 亚洲国产成人久久精品影视| 久久久噜噜噜www成人网| 免费久久人人爽人人爽av| 亚洲午夜无码AV毛片久久| 久久成人永久免费播放| 国产午夜精品久久久久九九电影| 天天做夜夜做久久做狠狠| 久久国产精品二国产精品| 亚洲中文字幕无码久久2020| 丁香五月综合久久激情| 亚洲人成无码网站久久99热国产| 国内精品久久久久久99| 秋霞久久国产精品电影院| 国产呻吟久久久久久久92| 天天爽天天狠久久久综合麻豆| 久久久噜噜噜www成人网| 久久久久国色AV免费看图片| 伊人精品久久久久7777| 99久久亚洲综合精品成人| 2021国产精品午夜久久| 久久久久无码中| 97久久精品人人澡人人爽| 国产欧美一区二区久久| 久久久久成人精品无码| 国产日产久久高清欧美一区| 嫩草伊人久久精品少妇AV| 狠狠色丁香婷婷综合久久来| 无码超乳爆乳中文字幕久久 | 久久精品国产精品青草app| 成人午夜精品无码区久久| 中文字幕精品无码久久久久久3D日动漫 | 久久天天躁狠狠躁夜夜不卡| 亚洲国产成人精品女人久久久 | 亚洲精品白浆高清久久久久久| 亚洲欧美精品一区久久中文字幕| 久久精品无码一区二区三区免费 | 人人狠狠综合久久亚洲高清| 狠狠色丁香婷婷综合久久来来去|