计算 Base64 编码消息的大小
Calculate the size to a Base 64 decoded message
我有一个 BASE64 编码字符串:
static const unsigned char base64_test_enc[] =
"VGVzdCBzdHJpbmcgZm9yIGEgc3RhY2tvdmVyZmxvdy5jb20gcXVlc3Rpb24=";
它没有 CRLF-per-72 字符。
如何计算解码后的消息长度?
好吧,base64 表示 4 个字符中的 3 个字节...所以开始时,您只需除以 4 再乘以 3。
然后您需要考虑 padding:
- 如果文本以
"=="
结尾则需要减去2个字节(因为最后一组4个字符只代表1个字节)
- 如果文本仅以
"="
结尾,则需要减去 1 个字节(因为最后一组 4 个字符代表 2 个字节)
- 如果文本根本没有以填充结尾,则不需要减去任何内容(因为最后一组 4 个字符正常表示 3 个字节)
Base 64 每 3 个字节使用 4 个字符。如果它使用填充,它总是有 4 个字符的倍数。
此外,存在三种填充可能性:
- 一个编码字节的两个字符和两个填充字符
==
- 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;
}
请注意,此代码假设输入是有效的 base 64。
一个好的观察者会注意到有多余的位,如果使用填充,通常在最后的字符中设置为 0。
我有一个 BASE64 编码字符串:
static const unsigned char base64_test_enc[] =
"VGVzdCBzdHJpbmcgZm9yIGEgc3RhY2tvdmVyZmxvdy5jb20gcXVlc3Rpb24=";
它没有 CRLF-per-72 字符。
如何计算解码后的消息长度?
好吧,base64 表示 4 个字符中的 3 个字节...所以开始时,您只需除以 4 再乘以 3。
然后您需要考虑 padding:
- 如果文本以
"=="
结尾则需要减去2个字节(因为最后一组4个字符只代表1个字节) - 如果文本仅以
"="
结尾,则需要减去 1 个字节(因为最后一组 4 个字符代表 2 个字节) - 如果文本根本没有以填充结尾,则不需要减去任何内容(因为最后一组 4 个字符正常表示 3 个字节)
Base 64 每 3 个字节使用 4 个字符。如果它使用填充,它总是有 4 个字符的倍数。
此外,存在三种填充可能性:
- 一个编码字节的两个字符和两个填充字符
==
- 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;
}
请注意,此代码假设输入是有效的 base 64。
一个好的观察者会注意到有多余的位,如果使用填充,通常在最后的字符中设置为 0。