计算Base 64解码消息的大小

Calculate the size to a Base 64 decoded message

本文关键字:消息 解码 Base 计算      更新时间:2023-10-16

我有一个BASE64编码字符串:

static const unsigned char base64_test_enc[] =
    "VGVzdCBzdHJpbmcgZm9yIGEgc3RhY2tvdmVyZmxvdy5jb20gcXVlc3Rpb24=";

它没有CRLF-per-72字符。

如何计算解码后的消息长度?

好吧,base64表示4个字符中的3个字节。。。所以首先你只需要除以4再乘以3。

然后你需要考虑填充:

  • 如果文本以"=="结尾,则需要减去2个字节(因为最后一组4个字符仅代表1个字节)
  • 如果文本仅以"="结尾,则需要减去1个字节(因为最后一组4个字符表示2个字节)
  • 如果文本根本没有以填充结束,则不需要减去任何内容(因为最后一组4个字符表示正常情况下的3个字节)

Base 64每3个字节使用4个字符。如果它使用填充,它总是有4个字符的倍数。

此外,还有三种填充可能性:

  • 一个编码字节的两个字符和两个填充字符CCD_ 3
  • 3个字符和用于两个编码字节的一个填充字符=
  • 当然没有填充字符,形成3个字节

因此,您可以简单地将字符数除以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。