Base64編碼的原理及C++實現代碼

mx3y 10年前發布 | 1K 次閱讀 C/C++

Base64編碼在郵件中最為常見,呵呵,因為我最近就是在做郵箱報警,SMTP驗證就是Base64編碼用戶名和密碼進行驗證的,并且圖片為附件也是要 轉換成base64編碼的數據,然后再發送的。該編碼使用64個明文來編碼任意的二進制文件,它里面只使用了A-Z,a-z,0-9,+,/這64個字 符。編碼里面還有“=”號啊,不過等號不屬于編碼字符,而是填充字符。
我在網上查了很多關于Base64編碼代碼,大都比較的復雜和冗長,所以,就自己按照原理寫了一個。

base64編碼原理:
1)base64的編碼都是按字符串長度,以每3個8bit的字符為一組,
2)然后針對每組,首先獲取每個字符的ASCII編碼,
3)然后將ASCII編碼轉換成8bit的二進制,得到一組3*8=24bit的字節
4)然后再將這24bit劃分為4個6bit的字節,并在每個6bit的字節前面都填兩個高位0,得到4個8bit的字節
5)然后將這4個8bit的字節轉換成10進制,對照Base64編碼表 ,得到對應編碼后的字符。

static const char base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
//chsrc為源數據,chdes為Base64編碼后的數據,len為數據長度
void Base64_Code(unsigned char chsrc, unsigned char* chdes, int len)
{
      unsigned char char_array_3[3], char_array_4[4];
      int i = 0, j = 0;

  while(len--)
  {
        char_array_3[i++] = *(chsrc++);
        if(3 == i)
        {
              char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
              char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
              char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
              char_array_4[3] = char_array_3[2] & 0x3f;
              for(i = 0; i < 4; i++)
                    *(chdes+i) = base64_chars[char_array_4[i]];

              i = 0;
             chdes += 4;
        }
  }
  if(i)
  {
         for(j = i; j < 3; j++)
         char_array_3[j] = '\0';

        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
        char_array_4[3] = char_array_3[2] & 0x3f;

        for(j = 0; j < (i+1); j++)
              *(chdes++) = base64_chars[char_array_4[j]];

        while((3 > i++))
              *(chdes++) = '=';
  }

  *chdes = '\0';
  return;

} </pre>

 本文由用戶 mx3y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!