auto base64Decode = [](string strEncoded, string& out) -> bool {
static int map[] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,62,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,63,-1,26,27,28,29,30,31,32,33,
34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1 };//兼容非标准Base64中的“+”和“/”分别改成了“-”和“_”
// 长度是4的倍数时,末尾才可能会有=填充,最多2个
// 避免中间每76个字符加一个换行符,导致判断错误,就不判断了,直接尝试丢弃末尾的2个=也没有什么问题
//if (strEncoded.size() % 4 == 0)
{
for (int i = 0; i < 2 && strEncoded.size() && strEncoded.back() == '='; i++) {
strEncoded.pop_back();
}
}
out.clear();
int value = 0;
int bits = 0;
for (char c : strEncoded) {
if (c == '\r' || c == '\n') {//忽略可能存在的换行
}
else if (c >= 0 && map[c] >= 0) {
value = (value << 6) | map[c];
bits += 6;
if (bits >= 8) {
out.push_back((value >> (bits - 8)) & 0xFF);
bits -= 8;
}
}
else {//遇到了无效的base64元字符,则失败
return false;
}
}
//可能会剩下不足8个bit,正常情况,它们一定是0,需要丢弃
return true;
};
兼容末尾没有=填充,和非标准Base64中的“+”和“/”分别改成了“-”和“_”
然后我发现好像“编码_BASE64解码A”有个问题,就是原始字节末尾0,全都丢弃了
|