Base64算法将输入的字符串或一段数据编码成只含有{''A''-''Z'', ''a''-''z'', ''0''-''9'', ''+'', ''/''}这64个字符的串,
''=''用于填充。其编码的方法是,将输入数据流每次取6 bit,用此6 bit的值(0-63)作为索引去查表,输出相应字符。
这样,每3个字节将编码为4个字符(3×8 → 4×6);不满4个字符的以''=''填充。
编码的过程是这样的:
第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符。
然后将第一个字符左移4位加上第二个字符右移4位,即获得第二个目标字符。
再将第二个字符左移2位加上第三个字符右移6位,获得第三个目标字符。
最后取第三个字符的右6位即获得第四个目标字符。
在以上的每一个步骤之后,再把结果与 0x3F 进行 AND 位操作,就可以得到编码后的字符了。
80,114,105
01010000,01110010,01101001
Bit(1){20} = 00010100 {(01010000 & 11111100) >> 2} '高6位(高)组成6位字节.
Bit(2){07} = 00000111 {(01010000 & 00000011) << 4 + (01110010 & 11110000) >> 4} '第一字节低2位(高)与第二字节高4位(低)组成6位字节。
Bit(3){09} = 00001001 {(01110010 & 00001111) << 2 + (01101001 & 11000000) >> 6} '第二字节低4位(高)与第三字节高2位(低)组成6位字节。
Bit(4){41} = 00101001 {01101001 & 00111111} '第三字节低6位(低)组成6位;
- static wchar_t const keys[66] = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- void Endcode( unsigned char *Input, int Length, wchar_t *Output ){
- unsigned char byte1(0);
- unsigned char byte2(0);
- unsigned char byte3(0);
- unsigned char byte4(0);
- while ( Length > 0 ){
- byte1 = 0x3F & ( ( *(Input) & 0xFC ) >> 2 ); //把第一字节的高6位存入byte1;
- byte2 = 0x30 & ( ( *(Input++) & 0x03 ) << 4 ); //把第一字节的低2位存入byte2;
- byte3 = 64;
- byte4 = 64;
- if( Length > 1 ){
- byte2 |= 0x0F & ( ( *(Input) & 0xF0 ) >> 4 ); //把第二字节的高4位累加到byte2;
- byte3 = 0x3C & ( ( *(Input++) & 0x0F ) << 2 ); //把第二字节的低4位存入byte2;
- }
- if( Length > 2 ){
- byte3 |= 0x03 & ( ( *(Input) & 0xC0 ) >> 6 ); //把第三字节的高2位累加到byte3;
- byte4 = 0x3F & ( ( *(Input++) & 0x3F ) ); //把第三字节的低6位存入到byte4;
- }
- *Output++ = keys[byte1];
- *Output++ = keys[byte2];
- *Output++ = keys[byte3];
- *Output++ = keys[byte4];
- Length -= 3;
- }
- *Output = L'/0';
- }
- void Decode( wchar_t *Input, unsigned char *Output ){
- unsigned char byte1(0);
- unsigned char byte2(0);
- unsigned char byte3(0);
- unsigned char byte4(0);
- size_t Length = _tcslen( Input );
- //如果Base64字符串长度必需为4的整数倍。
- if( Length % 4 ) return ;
- while( Length > 0 ){
- byte1 = (unsigned char)( wcschr( keys, *Input++ ) - keys ); if( byte1 < 0 || byte1 > 64 ) return;
- byte2 = (unsigned char)( wcschr( keys, *Input++ ) - keys ); if( byte2 < 0 || byte2 > 64 ) return;
- byte3 = (unsigned char)( wcschr( keys, *Input++ ) - keys ); if( byte3 < 0 || byte3 > 64 ) return;
- byte4 = (unsigned char)( wcschr( keys, *Input++ ) - keys ); if( byte4 < 0 || byte4 > 64 ) return;
- *Output++ = ( ( byte1 << 2 ) & 0xFC ) | ( ( byte2 >> 4 ) & 0x03 ); if( byte3 == 64 ) break;
- *Output++ = ( ( byte2 << 4 ) & 0xF0 ) | ( ( byte3 >> 2 ) & 0x0F ); if( byte4 == 64 ) break;
- *Output++ = ( ( byte3 << 6 ) & 0xC0 ) | ( ( byte4 ) & 0x3F );
- Length -= 4;
- }
- }