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 Bytes
,Base64String
将具有 4 Characters
。
Base64 length calculation?
问题是,
Base64String
中的单个字符包含多少字节? 1、2 或更多
如果 1 character
是 1 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)
在我的 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 Bytes
,Base64String
将具有 4 Characters
。
Base64 length calculation?
问题是,
Base64String
中的单个字符包含多少字节? 1、2 或更多
如果 1 character
是 1 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)