• <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
            99国产精品久久| 久久国产精品无码一区二区三区| 久久久久久久精品成人热色戒| 久久噜噜电影你懂的| 久久久噜噜噜www成人网| 久久久久亚洲AV无码永不| 99久久无色码中文字幕人妻| 久久综合久久综合亚洲| 久久国产成人| 欧美麻豆久久久久久中文| 日日狠狠久久偷偷色综合96蜜桃 | 国内精品综合久久久40p| 波多野结衣久久一区二区| 99久久综合国产精品免费| 2021最新久久久视精品爱| 久久亚洲精品无码aⅴ大香| 亚洲欧美日韩久久精品第一区| AV无码久久久久不卡蜜桃| www久久久天天com| 久久婷婷五月综合色99啪ak| 香蕉久久AⅤ一区二区三区| 久久99久国产麻精品66| 精品乱码久久久久久久| 国产午夜福利精品久久| 奇米影视7777久久精品人人爽| 亚洲精品白浆高清久久久久久| 久久精品国产亚洲av高清漫画| 久久这里只有精品首页| 色8激情欧美成人久久综合电| 亚洲AV日韩AV永久无码久久| 久久这里只精品国产99热| 亚洲人成网站999久久久综合 | 久久久精品国产sm调教网站| 93精91精品国产综合久久香蕉| 久久综合狠狠综合久久97色| 久久九九兔免费精品6| 国产精品久久永久免费| 99久久国产宗和精品1上映 | 亚洲精品综合久久| 久久99国产亚洲高清观看首页| 青青热久久国产久精品|