获取base64解码数据的长度

时间:2014-03-17 23:05:08

标签: java scala base64

我需要计算base64解码数据的长度。

我有Base-64数据,我发送未编码的数据作为HTTP响应的主体(错字:我的意思是请求,但同样的想法)。

我需要发送Content-Length标题。

出于内存使用和性能的考虑,我宁愿实际上不是一次性对Base-64进行数据解码,而是对其进行流式处理。

鉴于base64数据,我如何计算解码数据的长度?我需要通用算法或Java / Scala解决方案。


编辑:这与OP要求的Calculate actual data size from Base64 encoded string length类似,但不重复

  

...我可以仅通过查看Base64编码字符串的长度来计算已编码的原始数据的长度吗?

答案是否定的。有必要查看填充。

我想知道长度和base64数据如何用于计算原始长度。

2 个答案:

答案 0 :(得分:3)

假设你不能只使用分块编码(从而避免发送Content-Length头),你需要查阅填充:

  • Base64将三个二进制八位字节编码为四个字符。你有4N Base64字符。设k为尾随'='字符的数量(即填充字符:0,1或2)。
  • 令M = 3 * floor((N-k)/ 4),即“完整的”3字节组块中的八位字节数。
  • 如果你有2个填充字符,那么你有M + 1个字节。
  • 如果你有1个填充字符,那么你有M + 2个字节。
  • 如果你有0个填充字符,那么你有M个字节。

当然,在这种情况下,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中排除行分隔符。