• <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>
            面對現(xiàn)實,超越自己
            逆水行舟,不進則退
            posts - 269,comments - 32,trackbacks - 0
            .h文件:
            #include <string>
            using namespace std;

            class ZBase64
            {
            public:
                /*編碼
                DataByte
                    [in]輸入的數(shù)據(jù)長度,以字節(jié)為單位
                
            */
                string Encode(const unsigned char* Data,int DataByte);
                /*解碼
                DataByte
                    [in]輸入的數(shù)據(jù)長度,以字節(jié)為單位
                OutByte
                    [out]輸出的數(shù)據(jù)長度,以字節(jié)為單位,請不要通過返回值計算
                    輸出數(shù)據(jù)的長度
                
            */
                string Decode(const char* Data,int DataByte,int& OutByte);
            };

            .cpp文件:
            #include "stdAfx.h"
            #include "ZBase64.h"

            string ZBase64::Encode(const unsigned char* Data,int DataByte)
            {
                //編碼表
                const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
                //返回值
                string strEncode;
                unsigned char Tmp[4]={0};
                int LineLength=0;
                for(int i=0;i<(int)(DataByte / 3);i++)
                {
                    Tmp[1] = *Data++;
                    Tmp[2] = *Data++;
                    Tmp[3] = *Data++;
                    strEncode+= EncodeTable[Tmp[1] >> 2];
                    strEncode+= EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];
                    strEncode+= EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];
                    strEncode+= EncodeTable[Tmp[3] & 0x3F];
                    if(LineLength+=4,LineLength==76) {strEncode+="\r\n";LineLength=0;}
                }
                //對剩余數(shù)據(jù)進行編碼
                int Mod=DataByte % 3;
                if(Mod==1)
                {
                    Tmp[1] = *Data++;
                    strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];
                    strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4)];
                    strEncode+= "==";
                }
                else if(Mod==2)
                {
                    Tmp[1] = *Data++;
                    Tmp[2] = *Data++;
                    strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];
                    strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];
                    strEncode+= EncodeTable[((Tmp[2] & 0x0F) << 2)];
                    strEncode+= "=";
                }
                
                return strEncode;
            }

            string ZBase64::Decode(const char* Data,int DataByte,int& OutByte)
            {
                //解碼表
                const char DecodeTable[] =
                {
            , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            // '+'
            , 0, 0,
            // '/'
            , 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'
            , 0, 0, 0, 0, 0, 0,
            , 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
            , 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'
            , 0, 0, 0, 0, 0,
            , 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
            , 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'
                };
                //返回值
                string strDecode;
                int nValue;
                int i= 0;
                while (i < DataByte)
                {
                    if (*Data != '\r' && *Data!='\n')
                    {
                        nValue = DecodeTable[*Data++] << 18;
                        nValue += DecodeTable[*Data++] << 12;
                        strDecode+=(nValue & 0x00FF0000) >> 16;
                        OutByte++;
                        if (*Data != '=')
                        {
                            nValue += DecodeTable[*Data++] << 6;
                            strDecode+=(nValue & 0x0000FF00) >> 8;
                            OutByte++;
                            if (*Data != '=')
                            {
                                nValue += DecodeTable[*Data++];
                                strDecode+=nValue & 0x000000FF;
                                OutByte++;
                            }
                        }
                        i += 4;
                    }
                    else// 回車換行,跳過
                    {
                        Data++;
                        i++;
                    }
                 }
                return strDecode;
            }

            使用示例(結(jié)合CxImage庫):
            CString CScanDlg::EncodeImage()
            {//對圖片進行Base64編碼
                ZBase64 zBase;
                //圖片編碼
                CxImage  image;   // 定義一個CxImage對象    
                image.Load(this->m_strImgPath, CXIMAGE_FORMAT_JPG);   //先裝載jpg文件,需要指定文件類型
                long size=0;//得到圖像大小
                BYTE* buffer=0;//存儲圖像數(shù)據(jù)的緩沖
                image.Encode(buffer,size,CXIMAGE_FORMAT_JPG);//把image對象中的圖像以type類型數(shù)據(jù)copy到buffer
                string strTmpResult=zBase.Encode(buffer,size);
                CString result;
                result = strTmpResult.c_str();
                return result;
            }

            void CScanDlg::DecodeImageData(CString strData)
            {//對Base64編碼過的數(shù)據(jù)解碼并顯示原圖片

                ZBase64 zBase;
                int OutByte=0;
                string strTmpResult=zBase.Decode(strData,strData.GetLength(),OutByte);
                int i,len = strTmpResult.length();
                BYTE *buffer = new BYTE[len];
                for (i=0;i<len;++i)
                {
                    buffer[i] = strTmpResult[i];
                }
                CxImage image(buffer,len,CXIMAGE_FORMAT_JPG);//把內(nèi)存緩沖buffer中的數(shù)據(jù)構(gòu)造成Image對象
                delete [] buffer;
                CDC* hdc = m_picture.GetDC();
                m_bitmap = image.MakeBitmap(hdc->m_hDC);
                HBITMAP h0ldBmp = m_picture.SetBitmap(m_bitmap);
                if(h0ldBmp) DeleteObject(h0ldBmp);
                if(hdc->m_hDC) m_picture.ReleaseDC(hdc);
                if(m_bitmap) DeleteObject(m_bitmap);
            }

            本文轉(zhuǎn)自:http://www.cnblogs.com/phinecos/archive/2008/10/10/1308272.html
            posted on 2013-03-20 14:00 王海光 閱讀(11343) 評論(0)  編輯 收藏 引用 所屬分類: MFC
            亚洲国产天堂久久久久久| 久久久久亚洲AV无码网站| 国产综合精品久久亚洲| 久久激情五月丁香伊人| 欧美粉嫩小泬久久久久久久| 2020国产成人久久精品| 亚洲AV日韩AV永久无码久久 | 精品国产乱码久久久久久郑州公司 | 精品人妻久久久久久888| 九九久久99综合一区二区| 精品久久久久久国产三级| 思思久久精品在热线热| 国产亚洲婷婷香蕉久久精品| 久久影视综合亚洲| 精品无码久久久久国产| 久久久久久久综合日本| 久久精品www人人爽人人| 国产69精品久久久久APP下载| avtt天堂网久久精品| 亚洲人AV永久一区二区三区久久| 久久成人国产精品| 亚洲国产视频久久| 国产高潮国产高潮久久久91| 欧美亚洲色综久久精品国产| 久久嫩草影院免费看夜色| 久久国产精品-久久精品| 亚洲午夜久久久久久噜噜噜| 久久亚洲天堂| 久久av免费天堂小草播放| 国产亚洲婷婷香蕉久久精品| 亚洲欧美日韩久久精品第一区| 久久久久久久综合日本| 久久国产成人亚洲精品影院| 日本福利片国产午夜久久| 国产美女久久精品香蕉69| 亚洲中文久久精品无码ww16| 亚洲国产成人久久综合一区77| 久久er国产精品免费观看8| 国产成人精品久久| 日本精品久久久中文字幕| 蜜臀av性久久久久蜜臀aⅴ麻豆|