unsigned char base64_decodeconst char data size_t input_length size_t output_length if input_length 4 != 0 输入数据长度必须是4的倍数 return NULL; 计算解码后的数据长度 size_t decoded_length = input_length 4 3; if data
这个问题是由于最后一个字符的解码错误导致的。在解码过程中,如果输入数据末尾有一个“=”号,则解码后的数据长度减1,如果输入数据末尾有两个“=”号,则解码后的数据长度减2。但是,在处理最后一个字符时,如果这个字符是“=”号,就会被认为是0,这会导致解码错误。
为了解决这个问题,可以在处理最后一个字符时,先判断这个字符是否是“=”号,如果是“=”号,就不要计算它的值,直接跳过即可。
下面是修改后的代码:
unsigned char *base64_decode(const char *data, size_t input_length, size_t *output_length) { if (input_length % 4 != 0) // 输入数据长度必须是4的倍数 return NULL;
// 计算解码后的数据长度
size_t decoded_length = input_length / 4 * 3;
if (data[input_length - 1] == '=') // 如果输入数据末尾有一个“=”号,则解码后的数据长度减1
decoded_length--;
if (data[input_length - 2] == '=') // 如果输入数据末尾有两个“=”号,则解码后的数据长度减2
decoded_length--;
// 分配空间保存解码后的数据
unsigned char *decoded_data = (unsigned char *) malloc(decoded_length);
if (decoded_data == NULL) // 如果分配空间失败,则返回NULL
return NULL;
// 遍历输入数据
for (size_t i = 0, j = 0; i < input_length;) {
uint32_t sextet_a = data[i] == '=' ? 0 & i++ : strchr(base64_alphabet, data[i++]) - base64_alphabet;
uint32_t sextet_b = data[i] == '=' ? 0 & i++ : strchr(base64_alphabet, data[i++]) - base64_alphabet;
uint32_t sextet_c = data[i] == '=' ? 0 & i++ : strchr(base64_alphabet, data[i++]) - base64_alphabet;
uint32_t sextet_d = data[i] == '=' ? 0 & i++ : strchr(base64_alphabet, data[i++]) - base64_alphabet;
// 如果最后一个字符是“=”号,则不要计算它的值
if (data[i - 1] == '=')
continue;
uint32_t triple = (sextet_a << 3 * 6) + (sextet_b << 2 * 6) + (sextet_c << 1 * 6) + (sextet_d << 0 * 6);
// 取出拼接后的整数的前8位作为原始数据
decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
// 取出拼接后的整数的中间8位作为原始数据
decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
// 取出拼接后的整数的后8位作为原始数据
decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
}
// 将输出数据长度保存到参数指针所指向的变量中
*output_length = decoded_length;
// 返回解码后的数据
return decoded_data;
原文地址: https://www.cveoy.top/t/topic/eJw1 著作权归作者所有。请勿转载和采集!