在阅读base64维基之后…
我想知道这个公式是怎么运作的
给定一个长度为n的字符串,base64的长度为
即:4*Math.Ceiling(((double)s.Length/3)))
我已经知道base64的长度必须是%4==0,以允许解码器知道原始文本的长度。
序列的最大填充数可以是=或==。
wiki:每个输入字节的输出字节数大约是4 / 3 (33%) 开销)
问题:
以上信息是如何与输出长度相匹配的?
在阅读base64维基之后…
我想知道这个公式是怎么运作的
给定一个长度为n的字符串,base64的长度为
即:4*Math.Ceiling(((double)s.Length/3)))
我已经知道base64的长度必须是%4==0,以允许解码器知道原始文本的长度。
序列的最大填充数可以是=或==。
wiki:每个输入字节的输出字节数大约是4 / 3 (33%) 开销)
问题:
以上信息是如何与输出长度相匹配的?
当前回答
每个字符代表6位(log2(64) = 6)。
因此用4个字符表示4 * 6 = 24位= 3个字节。
所以你需要4*(n/3)个字符来表示n个字节,这需要四舍五入到4的倍数。
由于四舍五入到4的倍数而导致的未使用填充字符的数量显然是0、1、2或3。
其他回答
4 * n / 3为无填充长度。
并四舍五入到最接近4的倍数进行填充,因为4是2的幂,可以使用逐位逻辑运算。
((4 * n / 3) + 3) & ~3
在windows中-我想估计mime64大小的缓冲区的大小,但所有精确的计算公式都不适合我-最后我得到了这样的近似公式:
Mine64字符串分配大小(近似) =((4 *((二进制缓冲区大小)+ 1))/ 3)+ 1)
所以最后+1 -它用于ascii- 0 -最后一个字符需要分配来存储零结束-但为什么“二进制缓冲区大小”是+1 -我怀疑有一些mime64终止字符?或者这可能是一些对齐问题。
如果n%3不为零,我相信这个是正确答案,不是吗?
(n + 3-n%3)
4 * ---------
3
Mathematica版本:
SizeB64[n_] := If[Mod[n, 3] == 0, 4 n/3, 4 (n + 3 - Mod[n, 3])/3]
玩得开心
GI
每个字符代表6位(log2(64) = 6)。
因此用4个字符表示4 * 6 = 24位= 3个字节。
所以你需要4*(n/3)个字符来表示n个字节,这需要四舍五入到4的倍数。
由于四舍五入到4的倍数而导致的未使用填充字符的数量显然是0、1、2或3。
如果有人有兴趣在JS中实现@Pedro Silva解决方案,我只是为它移植了相同的解决方案:
const getBase64Size = (base64) => {
let padding = base64.length
? getBase64Padding(base64)
: 0
return ((Math.ceil(base64.length / 4) * 3 ) - padding) / 1000
}
const getBase64Padding = (base64) => {
return endsWith(base64, '==')
? 2
: 1
}
const endsWith = (str, end) => {
let charsFromEnd = end.length
let extractedEnd = str.slice(-charsFromEnd)
return extractedEnd === end
}