Base64编码:

  1、字符集:A~Z,a~z,0~9,+,/,=

  2、把3个字节的字符,编码成4个字节的字符,不能显式的读出字符内容,不包含特殊字符。

char a b c
ASCII 97 98 99
BIN 01100001 01100010 01100011
->Base64:按6个比特位分割,3*8分割成4*6个bit
  011000  010110   001001   100011
->高位补0,变成4个字节
  00011000   00010110   00001001   00100011
转成字符:字符范围(0~63),映射数字到字符集:
0~25 到 A~Z,26~51 到 a~z,52~61 到 0~9,62 到 +,63 到 /

  3、最后任何字符编码后都是这样字符的组合。

实现方法一:

结果 ra  rb  rc  rd
rd=c & 63
rc=( b<< 2 & ( c & 192 )) & 63
rb=(( c<< 4 & 48)&( b >> 4 & 15 )) & 63
rd=( c >> 2 ) & 63

数据在内存的存放方式:

  'A'转ASCII码,再转二进制:1000001,高位补零01000001,在内存是倒着存10000010

  

  1 // EmailSend.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <filesystem>
  6 
  7 #define OK 0
  8 #define ERR -1
  9 
 10 typedef struct Base64Cov
 11 {
 12     unsigned int sect1 : 6;
 13     unsigned int sect2 : 6;
 14     unsigned int sect3 : 6;
 15     unsigned int sect4 : 6;
 16 }BASE64COV_S;
 17 
 18 char ConvertToBase64(char c)
 19 {
 20     if (c < 26)
 21     {
 22         return 'A' + c;
 23     }
 24     else if (c < 52)
 25     {
 26         return 'a' + (c - 26);
 27     }
 28     else if (c < 62)
 29     {
 30         return '0' + (c - 52);
 31     }
 32     else if (c == 62)
 33     {
 34         return '+';
 35     }
 36     else if (63 == c)
 37     {
 38         return '/';
 39     }
 40     return OK;
 41 }
 42 
 43 //把szSrc每3个字符编码成4个字符
 44 int EncodeBase64(char szRet[], char szSrc[], int iSrcLen)
 45 {
 46     BASE64COV_S *pBase;
 47     char szTmp[3] = { 0 };
 48     int iLoop = iSrcLen / 3;
 49     int iSrcOffSet;
 50     int iRetOffSet;
 51     int i;
 52 
 53     pBase = (BASE64COV_S *)szTmp;
 54     for (i = 0; i < iLoop; i++)
 55     {
 56         iSrcOffSet = i * 3;
 57         iRetOffSet = i * 4;
 58         //3个字符逆序放入szTmp
 59         szTmp[0] = *(szSrc + iSrcOffSet + 2);
 60         szTmp[1] = *(szSrc + iSrcOffSet + 1);
 61         szTmp[2] = *(szSrc + iSrcOffSet + 0);
 62 
 63         pBase = (BASE64COV_S *)szTmp;
 64         szRet[i * 4 + 0] = ConvertToBase64(pBase->sect4);
 65         szRet[i * 4 + 1] = ConvertToBase64(pBase->sect3);
 66         szRet[i * 4 + 2] = ConvertToBase64(pBase->sect2);
 67         szRet[i * 4 + 3] = ConvertToBase64(pBase->sect1);
 68     }
 69     if (1 == iSrcLen % 3)
 70     {
 71         iSrcOffSet += 3;
 72         iRetOffSet += 4;
 73 
 74         szTmp[0] = *(szSrc + iSrcOffSet);
 75         szTmp[1] = 0;
 76         szTmp[2] = 0;
 77 
 78         pBase = (BASE64COV_S *)szTmp;
 79         szRet[i * 4 + 0] = ConvertToBase64(pBase->sect4);
 80         szRet[i * 4 + 1] = ConvertToBase64(pBase->sect3);
 81         szRet[i * 4 + 2] = '=';
 82         szRet[i * 4 + 3] = '=';
 83     }
 84     else if (2 == iSrcLen % 3)
 85     {
 86         iSrcOffSet += 3;
 87         iRetOffSet += 4;
 88 
 89         szTmp[0] = *(szSrc + iSrcOffSet + 1);
 90         szTmp[1] = *(szSrc + iSrcOffSet + 0);
 91         szTmp[2] = 0;
 92 
 93         pBase = (BASE64COV_S *)szTmp;
 94         szRet[i * 4 + 0] = ConvertToBase64(pBase->sect4);
 95         szRet[i * 4 + 1] = ConvertToBase64(pBase->sect3);
 96         szRet[i * 4 + 2] = ConvertToBase64(pBase->sect2);
 97         szRet[i * 4 + 3] = '=';
 98     }
 99 
100     return OK;
101 }
102 
103 int _tmain(int argc, _TCHAR* argv[])
104 {
105     //int a = 0x44332211;
106     //char szBuf[] = { 0x11, 0x22, 0x33, 0x44 };
107     //BASE64COV_S * pst;
108     //pst = (BASE64COV_S *)&a;
109     //printf("%x\n", pst->sect1);
110 
111     char szRet[100] = { 0 };
112     char szSrc[] = "abcdef";
113 
114     EncodeBase64(szRet, szSrc, strlen(szSrc));
115     printf("Ret:%s\n", szRet);
116 
117     system("pause");
118     return 0;
119 }

 

posted on 2015-10-21 12:47  俗剑仙·情如梦  阅读(175)  评论(0编辑  收藏  举报