Base64编码及其作用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Base64编码的作用:由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII 字符的数据转换成ASCII字符的一种方法。它使用下面表中所使用的字符与编码。
而且base64特别适合在http,mime协议下快速传输数据。
base64其实不是安全领域下的加密解密算法。虽然有时候经常看到所谓的base64加密解密。其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。
Base64编码方法要求把每三个8Bit的字节转换为四个6Bit的字节,其中,转换之后的这四个字节中每6个有效bit为是有效数据,空余的那两个bit用0补上成为一个字节。因此Base64所造成数据冗余不是很严重,Base64是当今比较流行的编码方法,因为它编起来速度快而且简单
举个例子,有三个字节的原始数据:aaaaaabb bbbbccccc ccdddddd(这里每个字母表示一个bit位)
那么编码之后会变成:00aaaaaa00bbbbbb00cccccc
00dddddd
所以可以看出base64编码简单,虽然编码后不是明文,看不出原文,但是解码也很简单
一、编码规则
Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个“=”。
例:将对ABC进行BASE64编码:
1、首先取ABC对应的ASCII码值。A(65)B(66)C(67);
2、再取二进制值A(01000001)B(01000010)C(01000011);
3、然后把这三个字节的二进制码接起来(010000010100001001000011);
4、再以6位为单位分成4个数据块,并在最高位填充两个0后形成4个字节的编码后的值,(00010000)(00010100)(00001001)(00000011),其中蓝色部分为真实数据;
5、再把这四个字节数据转化成10进制数得(16)(20)(9)(3);
6、最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D),这里的值实际就是数据在字符表中的索引。
注:BASE64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
二、解码规则
解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。
三、C#中的实现
编码类:
///
///Base64编码类。
///将byte[]类型转换成Base64编码的string类型。
///
publicclass Base64Encoder
{
byte[] source;
int length, length2;
int blockCount;
int paddingCount;
publicstatic Base64Encoder Encoder = new Base64Encoder();
public Base64Encoder()
{
}
privatevoid init(byte[] input)
{
source = input;
length = input.Length;
if((length % 3) == 0)
{
paddingCount = 0;
blockCount = length / 3;
}
else
{
paddingCount = 3- (length % 3);
blockCount = (length + paddingCount) / 3;
}
length2 = length + paddingCount;
}
publicstring GetEncoded(byte[] input)
{
//初始化
init(input);
byte[] source2;
source2 = newbyte[length2];
for(int x = 0; x < length2; x++)
{
if(x < length)
{
source2[x] = source[x];
}
else
{
source2[x] = 0;
}
}
byte b1, b2, b3;
byte temp, temp1, temp2, temp3, temp4; byte[] buffer = newbyte[blockCount * 4]; char[] result = newchar[blockCount * 4]; for(int x = 0; x < blockCount; x++) {
b1 = source2[x * 3];
b2 = source2[x * 3+ 1];
b3 = source2[x * 3+ 2];
temp1 = (byte)((b1 &252) >>2);
temp = (byte)((b1 &3) <<4);
temp2 = (byte)((b2 &240) >>4);
temp2 += temp;
temp = (byte)((b2 &15) <<2);
temp3 = (byte)((b3 &192) >>6);
temp3 += temp;
temp4 = (byte)(b3 &63);
buffer[x * 4] = temp1;
buffer[x * 4+ 1] = temp2;
buffer[x * 4+ 2] = temp3;
buffer[x * 4+ 3] = temp4;
}
for(int x = 0; x < blockCount * 4; x++)