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

时间:2015-08-07 10:20:21

标签: android character-encoding base64 heap-memory android-memory

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

收到请求后,服务器首先将byte[]编码为Base64String并返回该字符串。并且,在将其呈现为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 Bytes原始数据,Base64String4 Characters

Base64 length calculation?

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

如果1 character1 byte, 在我的测试中,堆增长和缩小 26 MB 。那么为什么Base64String的累积长度仅为 11.4 MB

更新

enter image description here

这意味着每个角色1 Byte

enter image description here

此处的默认CharacterSet为UTF-8

1 个答案:

答案 0 :(得分:3)

让我们从头开始......

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)

相关问题