我需要计算base64解码数据的长度。
我有Base-64数据,我发送未编码的数据作为HTTP响应的主体(错字:我的意思是请求,但同样的想法)。
我需要发送Content-Length
标题。
出于内存使用和性能的考虑,我宁愿实际上不是一次性对Base-64进行数据解码,而是对其进行流式处理。
鉴于base64数据,我如何计算解码数据的长度?我需要通用算法或Java / Scala解决方案。
编辑:这与OP要求的Calculate actual data size from Base64 encoded string length类似,但不重复
...我可以仅通过查看Base64编码字符串的长度来计算已编码的原始数据的长度吗?
答案是否定的。有必要查看填充。
我想知道长度和base64数据如何用于计算原始长度。
答案 0 :(得分:3)
假设你不能只使用分块编码(从而避免发送Content-Length头),你需要查阅填充:
当然,在这种情况下,floor()意味着截断整数除法,即正常/运算符。
据推测,您可以相对容易地计算填充八位字节(例如,通过查找文件的末尾,或查看字节数组的结尾),而无需按顺序读取整个Base64编码的内容。
答案 1 :(得分:1)
我到达了这个简单的计算。
如果L
是Base-64编码数据的长度,p
是填充字符数(将为0,1或2),那么未编码的长度数据是
L * 3 / 4 - p
在我的情况下(使用Scala),
bytes.length * 3 / 4 - bytes.reverseIterator.takeWhile(_ == '=').length
注意:这是假设数据没有行分隔符。 (通常,Base-64数据每72个字符左右会有一行。)如果是,则从长度L
中排除行分隔符。