Base64編解碼代碼(CXImage 類處理)

來源:互聯網
上載者:User

#include <string><br />using namespace std;<br />class ZBase64<br />{<br />public:<br /> //編碼<br /> //DataByte<br /> // [in]輸入的資料長度,以位元組為單位<br /> //<br /> string Encode(const unsigned char* Data,int DataByte);<br /> //解碼<br /> //DataByte<br /> // [in]輸入的資料長度,以位元組為單位<br /> //OutByte<br /> // [out]輸出的資料長度,以位元組為單位,請不要通過傳回值計算<br /> // 輸出資料的長度<br /> string Decode(const char* Data,int DataByte,int& OutByte);<br />};<br />#include "stdAfx.h"<br />#include "ZBase64.h"<br />string ZBase64::Encode(const unsigned char* Data,int DataByte)<br />{<br /> //編碼錶<br /> const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";<br /> //傳回值<br /> string strEncode;<br /> unsigned char Tmp[4]={0};<br /> int LineLength=0;<br /> for(int i=0;i<(int)(DataByte / 3);i++)<br /> {<br /> Tmp[1] = *Data++;<br /> Tmp[2] = *Data++;<br /> Tmp[3] = *Data++;<br /> strEncode+= EncodeTable[Tmp[1] >> 2];<br /> strEncode+= EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];<br /> strEncode+= EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];<br /> strEncode+= EncodeTable[Tmp[3] & 0x3F];<br /> if(LineLength+=4,LineLength==76) {strEncode+="/r/n";LineLength=0;}<br /> }<br /> //對剩餘資料進行編碼<br /> int Mod=DataByte % 3;<br /> if(Mod==1)<br /> {<br /> Tmp[1] = *Data++;<br /> strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];<br /> strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4)];<br /> strEncode+= "==";<br /> }<br /> else if(Mod==2)<br /> {<br /> Tmp[1] = *Data++;<br /> Tmp[2] = *Data++;<br /> strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];<br /> strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];<br /> strEncode+= EncodeTable[((Tmp[2] & 0x0F) << 2)];<br /> strEncode+= "=";<br /> }</p><p> return strEncode;<br />}<br />string ZBase64::Decode(const char* Data,int DataByte,int& OutByte)<br />{<br /> //解碼錶<br /> const char DecodeTable[] =<br /> {<br /> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,<br /> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,<br /> 62, // '+'<br /> 0, 0, 0,<br /> 63, // '/'<br /> 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'<br /> 0, 0, 0, 0, 0, 0, 0,<br /> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,<br /> 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'<br /> 0, 0, 0, 0, 0, 0,<br /> 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,<br /> 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'<br /> };<br /> //傳回值<br /> string strDecode;<br /> int nValue;<br /> int i= 0;<br /> while (i < DataByte)<br /> {<br /> if (*Data != '/r' && *Data!='/n')<br /> {<br /> nValue = DecodeTable[*Data++] << 18;<br /> nValue += DecodeTable[*Data++] << 12;<br /> strDecode+=(nValue & 0x00FF0000) >> 16;<br /> OutByte++;<br /> if (*Data != '=')<br /> {<br /> nValue += DecodeTable[*Data++] << 6;<br /> strDecode+=(nValue & 0x0000FF00) >> 8;<br /> OutByte++;<br /> if (*Data != '=')<br /> {<br /> nValue += DecodeTable[*Data++];<br /> strDecode+=nValue & 0x000000FF;<br /> OutByte++;<br /> }<br /> }<br /> i += 4;<br /> }<br /> else// 斷行符號換行,跳過<br /> {<br /> Data++;<br /> i++;<br /> }<br /> }<br /> return strDecode;<br />}<br />使用樣本(結合CxImage庫):<br />CString CScanDlg::EncodeImage()<br />{//對圖片進行Base64編碼<br /> ZBase64 zBase;<br /> //圖片編碼<br /> CxImage image; // 定義一個CxImage對象<br /> image.Load(this->m_strImgPath, CXIMAGE_FORMAT_JPG); //先裝載jpg檔案,需要指定檔案類型<br /> long size=0;//得到映像大小<br /> BYTE* buffer=0;//儲存映像資料的緩衝<br /> image.Encode(buffer,size,CXIMAGE_FORMAT_JPG);//把image對象中的映像以type類型資料copy到buffer<br /> string strTmpResult=zBase.Encode(buffer,size);<br /> CString result;<br /> result = strTmpResult.c_str();<br /> return result;<br />}<br />void CScanDlg::DecodeImageData(CString strData)<br />{//對Base64編碼過的資料解碼並顯示原圖片<br /> ZBase64 zBase;<br /> int OutByte=0;<br /> string strTmpResult=zBase.Decode(strData,strData.GetLength(),OutByte);<br /> int i,len = strTmpResult.length();<br /> BYTE *buffer = new BYTE[len];<br /> for (i=0;i<len;++i)<br /> {<br /> buffer[i] = strTmpResult[i];<br /> }<br /> CxImage image(buffer,len,CXIMAGE_FORMAT_JPG);//把記憶體緩衝buffer中的資料構造成Image對象<br /> delete [] buffer;<br /> CDC* hdc = m_picture.GetDC();<br /> m_bitmap = image.MakeBitmap(hdc->m_hDC);<br /> HBITMAP h0ldBmp = m_picture.SetBitmap(m_bitmap);<br /> if(h0ldBmp) DeleteObject(h0ldBmp);<br /> if(hdc->m_hDC) m_picture.ReleaseDC(hdc);<br /> if(m_bitmap) DeleteObject(m_bitmap);<br />} 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.