我需要计算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/