Win32中的容错base64解码

/* 解码
* const char * base64 码字
* unsigned char * bindata, 解码恢复的数据
* */ 
int base64_decode(const char * base64, unsigned char * bindata)
{ 
	int i, j;
	unsigned char k;
	unsigned char temp[4];
	for (i = 0, j = 0; base64[i] != '\0'; i += 4)
	{
		memset(temp, 0xFF, sizeof(temp));
		//要取的码值不能为空格和换行
		while (base64[i] == '\n'|| base64[i] == '\r')
		{
			i++;
		}
		//找到对应的解码赋值给temp[x]
		for (k = 0; k < 64; k++)
		{
			if (base64char[k] == base64[i])
				temp[0] = k;
		}
		while (base64[i+1] == '\n' || base64[i] == '\r')
		{
			i++;
		}
		for (k = 0; k < 64; k++)
		{
			if (base64char[k] == base64[i + 1])
				temp[1] = k;
		}
		while (base64[i + 2] == '\n' || base64[i] == '\r')
		{
			i++;
		}
		for (k = 0; k < 64; k++)
		{
			if (base64char[k] == base64[i + 2])
				temp[2] = k;
		}
		while (base64[i + 3] == '\n' || base64[i] == '\r')
		{
			i++;
		}
		for (k = 0; k < 64; k++)
		{
			if (base64char[k] == base64[i + 3])
				temp[3] = k;
		}
		if (base64[i] == '=')
			break;
		if (base64[i+1] == '=')
			break;
		//1.temp[0]中左移两位去掉高位两个0,与1111 1100做与运算保留后六位
		//2.temp[1]中右移四位去掉末尾四位数,与0011做与预算只保留temp有效6位中的前两位
		//3.将以上两个字符做或运算变成一个8位有效字符
		bindata[j] = ((((temp[0] << 2)) & 0xFC)) |(((temp[1] >> 4) & 0x03));
		j++;
		if (base64[i + 2] == '=')
			break;
		//4.temp[1]中左移四位,1111 0000 做与运算保留后四位
		//5.temp[2]中右移两位,0000 1111 做与运算保留前四位
		bindata[j] = ((((temp[1] << 4)) & 0xF0)) |(((temp[2] >> 2) & 0x0F));
		j++;
		if (base64[i + 3] == '=')
			break;
		//6.temp[2]左移6位,1100 0000 做与运算保留前两位
		//7.temp[3]与0011 1111 做与运算,和处理后的temp[2]或运算
		bindata[j] = ((temp[2] << 6) & 0xC0) |(temp[3] & 0x3F);
		j++;
	}
	return j;
}

这一段代码最核心的除了解码运算外,主要是去掉\n \r 的步骤,由于我的粗心,之前没有去掉这两个多余的符号,导致解码中文出来以后总是会部分乱码

此函数中可能有多余的步骤,但是功能是测试过的,base64变量为编码值,最终解码值赋值在bindata,在这里我没有输出了,感兴趣可以copy到项目中试一试。

猜你喜欢

转载自blog.csdn.net/hu421160052/article/details/87191630