标签:
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 }
标签:
原文地址:http://www.cnblogs.com/djetcgw/p/4897453.html