java - 获取base64解码数据的长度

标签 java scala base64

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

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

我需要发送一个 Content-Length header 。

为了内存使用和性能,我宁愿不使用 Base-64 一次解码所有数据,而是流式传输。

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


编辑:这类似于Calculate actual data size from Base64 encoded string length,但不是重复的,OP 询问的地方

...can I calculate the length of the raw data that has been encoded only by looking at the length of the Base64-encoded string?

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

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

最佳答案

假设您不能只使用分块编码(从而避免发送 Content-Length header ),您需要这样查询填充:

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

当然,在这种情况下,floor() 意味着截断整数除法,即正常的/运算符。

大概您可以相对轻松地计算填充八位字节(例如,通过寻找文件末尾,或通过查看字节数组的末尾),而不必按顺序读取整个 Base64 编码的内容。

关于java - 获取base64解码数据的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22467231/

相关文章:

java - 在 Artifact 的 pom 文件上运行 Maven 插件

java - InputStream 的 available() 趋于停止

java - Android 中的签名

scala - 模式匹配是在编译时还是运行时解决的?

iphone - 如何在ios中将base64字符串解码为NSString?

java - 如何通过返回主方法然后输入第二个方法将两个并行数组从一种方法移动到另一种方法?

scala - 以单个值收集多个偏函数的结果?

scala - Liquibase 找不到解析器

java - java.util.Base64.getMimeDecoder() 接受长度超过 76 个字符的 String 是否正常?

python - Base64解码直到没有Base64