Base-64 字符数组或字符串的长度无效
最近遇到的问题,报Base-64 字符数组或字符串的长度无效,代码在本地环境测试是没问题的,可以正常解析出来,但部署到服务器上就是有这个问题,对比了请求的入参都一样,最后在网上搜了下解决方案,记录下来,以便以后查看。
代码:
public string DecodeBase64Str(string content)
{
var encryptedContent = content.Trim().Replace(" ", "+");
var bytes = Convert.FromBase64String(encryptedContent);
return Encoding.UTF8.GetString(bytes);
}
针对base64加密的特性改进后代码:
public string DecodeBase64Str(string content)
{
var encryptedContent = content.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+");
//base字符串必须被4整除,不足的在末尾填充'='号
if (encryptedContent.Length % 4 > 0)
{
encryptedContent = encryptedContent.PadRight(encryptedContent.Length + 4 - encryptedContent.Length % 4, '=');
}
var bytes = Convert.FromBase64String(encryptedContent);
return Encoding.UTF8.GetString(bytes);
}
Base64编码的知识补充:
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。
例如:
转换前 10101101,10111010,01110110
转换后 00101011, 00011011 ,00101001 ,00110110
十进制 43 27 41 54
对应码表中的值 r b p 2
所以上面的24位编码,编码后的Base64值为 rbp2
解码同理,把 rbq2 的二进制位连接上再重组得到三个8位值,得出原码。
作者:coder_yang
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.