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

Muk*_*ani 6 base64 android heap-memory character-encoding android-memory

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

收到请求后,服务器首先对byte[]into进行编码Base64String并返回该字符串.并且,在将其呈现到ImageViewAndroid应用程序时,将其解码Base64Stringbyte[],创建一个Bitmap并将其打开ImageView.

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

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

Bitmap已经回收的一次用户离开图像了,所以Bitmap实际上是不持有任何记忆,只要我们离开.

在一个特定的测试中,我下载了55个图像,我的堆从增长16 MB42 MB.这意味着,55张图像占据了26 MB.在我清除了所有这些之后,堆缩回了16 MB.

但是,当我拿出所有Base64String它的累积长度时,它就会出现11983840.如果我认为一个字符作为1 byte11983840 bytes品牌11.4 MB

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

我也看到了以下问题,其中提到,每个3 Bytes原始数据的Base64String都会有4 Characters.

Base64长度计算?

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

如果1 character1 byte,并且在我的测试中,堆增长和缩小了26 MB.那为什么长度的累积总和Base64String只有11.4 MB

更新

在此输入图像描述

这意味着1 Byte每个角色.

在此输入图像描述

这里的默认CharacterSet是UTF-8

ade*_*hus 4

让我们从头开始...

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)