Base64String 中的单个字符包含多少字节? 1个、2个或更多

a single character in Base64String holds how many bytes? 1, 2 or more

在我的 Android 应用程序中,要求是从服务器获取图像并将它们缓存到堆内存中。

收到请求后,服务器首先将 byte[] 编码为 Base64String 和 returns 该字符串。并且,在将其呈现为 ImageView 时,Android 应用程序将 Base64String 解码回 byte[],创建一个 Bitmap,并将其放在 ImageView.

由于所有内容都在缓存中,因此应用程序有可能在某个时刻内存不足,并严重崩溃。

为了防止出现内存不足的情况,我在我的应用程序中定义了一个安全量程(例如 5 MB)。如果在任何时候可用内存低于此 安全量程 ,则用户将需要将某些图像标记为要删除的候选图像。同时,应用程序将显示估计的内存将在清除所选项目后释放。

一旦用户离开图像,Bitmap 就会被回收,所以只要我们离开,Bitmap 实际上就不会保留任何内存。

在一个特定的测试中,我下载了 55 张图像,我的堆从 16 MB 增长到 42 MB。也就是说,55张图片占据26 MB。在我清除所有这些之后,堆缩小到 16 MB

但是,当我对所有 Base64String 的长度求和时,它得出 11983840。如果我将一个字符视为 1 byte,则 11983840 bytes 使 11.4 MB

问题是,Base64String 长度的累加和是我唯一可用的度量,它有助于让用户知道他的选择可以释放多少内存。

我还阅读了以下问题,其中提到,对于原始数据的每个 3 BytesBase64String 将具有 4 Characters

Base64 length calculation?

问题是, Base64String 中的单个字符包含多少字节? 1、2 或更多

如果 1 character1 byte, 在我的测试中,堆增长和收缩 26 MB。那为什么Base64String的长度累计和只有11.4MB?

已更新

这意味着每个字符 1 Byte

这里默认的字符集是UTF-8

让我们从头开始...

Base64 是一种基于一组 64 个字符的编码格式 - 每个字符相当于 6 位数据 (2^6 = 64)。所以在转换的时候,输入的每个8位字节需要(8 / 6) = 1.333333...个字符。

但是由于计算机只存储整个字节,所以更容易说输入的每 3 个字节(3*8=24 位)会产生 4 个 base-64 字符(4*6=24 位)。

现在,你说你的 base-64 字符串总长度是 1100 万个字符。在Java中,字符串以16位Unicode格式存储:1个字符=2个字节。

因此,仅在原始字符数据中,1100 万个字符就将使用超过 20 MB 的空间。结合存储信息所需的对象、变量和其他状态意味着 26 MB 是您使用的数据量的合理值。

因此,您可能想用来估计内存使用量的一般规则是 (((input_data_in_bytes * 4/3) * 2) + 几 MB)