Java Base64编码丢失数据
Java Base64 encoding loss of data
假设我有以下代码片段,其中 certificate
是一个 java 证书对象:
byte[] data = certificate.getEncoded();
String stringData = new String(Base64.encodeBase64(data));
byte[] newData = Base64.decodeBase64(stringData)
有没有可能 data
不等于 newData
?基本上,是否有信息丢失到字符串然后返回?
谢谢
假设没有因为内存不足错误或类似的一般问题而爆炸,这段代码应该没问题,但有一个很大的例外:
您正在将 Base64.encodeBase64
(byte[]
)的输出转换为 String
,但未指定编码。
这通常是个坏主意,因为它将使用平台默认编码。
在这种特定情况下,这不太可能是实际问题。因为 Base64 的输出仅包含 ASCII 字符,几乎所有现代平台都使用 ASCII 兼容编码作为其平台默认编码(例如 Android、Mac OS X 和大多数 Linux 发行版使用 UTF-8,Windows 倾向于使用一些代码页,但低 128 字节通常也与 ASCII 兼容)。
不过,最好使用 new String(Base64.encodeBase64(data), StandardCharsets.US_ASCII)
来确定(由于上述原因,ISO_8859_1
和 UTF_8
也可以,但是 US_ASCII
是“正确的”选择)。
假设我有以下代码片段,其中 certificate
是一个 java 证书对象:
byte[] data = certificate.getEncoded();
String stringData = new String(Base64.encodeBase64(data));
byte[] newData = Base64.decodeBase64(stringData)
有没有可能 data
不等于 newData
?基本上,是否有信息丢失到字符串然后返回?
谢谢
假设没有因为内存不足错误或类似的一般问题而爆炸,这段代码应该没问题,但有一个很大的例外:
您正在将 Base64.encodeBase64
(byte[]
)的输出转换为 String
,但未指定编码。
这通常是个坏主意,因为它将使用平台默认编码。
在这种特定情况下,这不太可能是实际问题。因为 Base64 的输出仅包含 ASCII 字符,几乎所有现代平台都使用 ASCII 兼容编码作为其平台默认编码(例如 Android、Mac OS X 和大多数 Linux 发行版使用 UTF-8,Windows 倾向于使用一些代码页,但低 128 字节通常也与 ASCII 兼容)。
不过,最好使用 new String(Base64.encodeBase64(data), StandardCharsets.US_ASCII)
来确定(由于上述原因,ISO_8859_1
和 UTF_8
也可以,但是 US_ASCII
是“正确的”选择)。