我有一个二进制字符串,我在Base 64编码.现在,我需要事先了解最终Base 64编码字符串的大小.
有没有办法计算出来?
就像是:
BinaryStringSize是64Kb编码后,EncodedBinaryStringSize将为127Kb.
哦,代码在C中.
谢谢.
geo*_*car 31
如果您完全正确地使用 Base64 ,并且包括用=
字符填充结尾,并且CR LF
每隔72个字符将其分解,则可以通过以下方式找到答案:
code_size = ((input_size * 4) / 3);
padding_size = (input_size % 3) ? (3 - (input_size % 3)) : 0;
crlfs_size = 2 + (2 * (code_size + padding_size) / 72);
total_size = code_size + padding_size + crlfs_size;
Run Code Online (Sandbox Code Playgroud)
在C语言中,你还可以与终止\0
字节,所以会出现一个额外的字节,并为你写他们,所以如果你只是想找你可能想在每个代码的最后长度检查你传递给malloc()
,你可能实际上更喜欢浪费几个字节的版本,以使编码更简单:
output_size = ((input_size * 4) / 3) + (input_size / 96) + 6;
Run Code Online (Sandbox Code Playgroud)
adz*_*dzm 24
geocar的答案很接近,但有时可能会稍微偏离.
每3个字节的输入有4个字节的输出.如果输入大小不是三的倍数,我们必须添加以使其成为一.否则不管它.
input_size + ( (input_size % 3) ? (3 - (input_size % 3)) : 0)
Run Code Online (Sandbox Code Playgroud)
将其除以3,然后乘以4.这是我们的总输出大小,包括填充.
code_padded_size = ((input_size + ( (input_size % 3) ? (3 - (input_size % 3)) : 0) ) / 3) * 4
Run Code Online (Sandbox Code Playgroud)
正如我在评论中所说,在加倍之前,总大小必须除以线宽,以正确计算最后一行.否则,CRLF字符的数量将被高估.我还假设只有一个CRLF对,如果该行是72个字符.这包括最后一行,但如果它不超过72个字符则不包括.
newline_size = ((code_padded_size) / 72) * 2
Run Code Online (Sandbox Code Playgroud)
所以把它们放在一起:
unsigned int code_padded_size = ((input_size + ( (input_size % 3) ? (3 - (input_size % 3)) : 0) ) / 3) * 4;
unsigned int newline_size = ((code_padded_size) / 72) * 2;
unsigned int total_size = code_padded_size + newline_size;
Run Code Online (Sandbox Code Playgroud)
或者使它更具可读性:
unsigned int adjustment = ( (input_size % 3) ? (3 - (input_size % 3)) : 0);
unsigned int code_padded_size = ( (input_size + adjustment) / 3) * 4;
unsigned int newline_size = ((code_padded_size) / 72) * 2;
unsigned int total_size = code_padded_size + newline_size;
Run Code Online (Sandbox Code Playgroud)
这是一个简单的C实现(没有模数和三元运算符),用于原始base64编码的大小(标准'='填充):
int output_size;
output_size = ((input_size - 1) / 3) * 4 + 4;
Run Code Online (Sandbox Code Playgroud)
为此,如果需要,您将需要为CRLF添加任何额外开销.标准base64编码(RFC 3548或RFC 4648)允许CRLF换行符(64或76个字符),但不需要它.MIME变体(RFC 2045)在每76个字符后需要换行符.
例如,使用上面构建的76个字符行的总编码长度:
int final_size;
final_size = output_size + (output_size / 76) * 2;
Run Code Online (Sandbox Code Playgroud)
有关更多变体,请参阅base64维基百科条目.
归档时间: |
|
查看次数: |
35124 次 |
最近记录: |