Java Base64从Sun到JDK8

3

我在数据库中有一堆字符串,它们是一段时间前使用sun.misc.BASE64Encoder编码的。

现在我想用java.util.Base64来解码(和进一步编码其他字符串)。

这两者之间的区别在于Sun版本会在每n个字符处添加一个新行字符串。

示例:

Sun Base64:   54y49568uyj304j534w5y
              34y0639j6yh93j5h0653j
              s45hr68o

JDK8 Base64:  54y49568uyj304j534w5y34y0639j6yh93j5h0653js45hr68o

为了让JDK解码器能够解析这些压缩字符串,我需要删除换行符。
问题:
1. 我应该删除 \r\n (Unix) 还是 \n (Windows) 或者 \r (旧版Mac)? 因为这些字符串依赖于它们被编码的机器。 2. 如果我使用 zippedString.replaceAll("\r", "").replaceAll("\n", ""),如何确保实际字符串中没有 \r 字符,从而导致数据损坏? 3. 是否有其他方法可以在这两个机制之间创建桥梁?

2
在 base64 编码的字符串中没有 \r\n,因此您可以将它们删除(这取决于编码过程,例如,一个人可能会逐字编码或逐行编码),请参见 https://tools.ietf.org/html/rfc4648#section-4。 - user180100
https://en.wikipedia.org/wiki/Base64: 没有 \r\n - Thomas
1
你尝试过使用Java 8的mime解码器吗?它被记录为忽略换行符。 - JB Nizet
2个回答

5

Base64中没有空格,所以我会将所有的空格都删除。

String toDecode = str.replaceAll("\\s+", "");

这将消除如何处理特定换行符或空格的任何歧义。

1

“\r”和“\n”字符在此处的目的纯粹与文本格式相关,您可以假设它们是不可见的。

读取字符串值的代码应该注意过滤掉它们,无论使用什么方法,例如:

读取行 ->修剪 ->连接

然后,解码连接的字符串。

顺便说一句,假设采用了不同的编码算法,并且这些字符是编码字母表的一部分。因为Java将“\r”和“\n”字符解释为新行的指示符(取决于操作系统),所以编码值的字符串表示需要进行转义,例如“14y6\\n75b….”。但是,这会带来更多问题而不是好处,因此应该避免使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接