我有一个BASE64编码字符串:
static const unsigned char base64_test_enc[] =
"VGVzdCBzdHJpbmcgZm9yIGEgc3RhY2tvdmVyZmxvdy5jb20gcXVlc3Rpb24=";
它没有每72个字符的CRLF。
如何计算解码的消息长度?
答案 0 :(得分:13)
嗯,base64代表4个字符的3个字节......所以从你开始就需要除以4并乘以3。
然后,您需要考虑padding:
"=="
结尾,则需要减去2个字节(因为最后一组4个字符仅代表1个字节)"="
结尾,则需要减去1个字节(因为最后一组4个字符代表2个字节)答案 1 :(得分:3)
Base 64每3个字节使用4个字符。如果它使用填充,则它总是有4个字符的倍数。
此外,还有三种填充方式:
==
=
所以你可以简单地将字符数除以4,然后乘以3,最后减去填充字符的数量。
可能的C代码可能是(如果我在C中没有生锈,请调整):
size_t encoded_base64_bytes(const char *input)
{
size_t len, padlen;
char *last, *first_pad;
len = strlen(input);
if (len == 0) return 0;
last = input + len - 4;
first_pad = strchr(last, '=');
padlen = first_pad == null ? 0 : last - first_pad;
return (len / 4) * 3 - padlen;
}
请注意,此代码假定输入是有效的基数64。
一个好的观察者会注意到有备用位,如果使用填充,通常在最后的字符中设置为0。