【发布时间】:2019-07-30 19:49:10
【问题描述】:
我想在 Base64 中对字符串进行编码,以便以后对其进行解码。我这样做编码它:
public static String encryptString(String string) {
byte[] bytesEncoded = Base64.getEncoder().encode(string.getBytes());
return (new String(bytesEncoded));
}
然后,编码的字符串使用 UTF-8 存储在磁盘上。重新启动应用程序后,从磁盘读取编码字符串,我正在尝试使用以下方法解码字符串:
public static String decryptString(String string) {
byte[] valueDecoded = Base64.getDecoder().decode(string);
return (new String(valueDecoded));
}
出了点问题,因为它给了我这个例外:
java.lang.IllegalArgumentException: Illegal base64 character d
at java.base/java.util.Base64$Decoder.decode0(Base64.java:743)
at java.base/java.util.Base64$Decoder.decode(Base64.java:535)
at java.base/java.util.Base64$Decoder.decode(Base64.java:558)
这是一步一步的TRACE
1º 我对此进行编码:{"configuration":{"shop":{"name":"","addressLine1":"","addressLine2":"","postalCode":"","city":"","country":"","phoneNumber":""}},"jointBets":[],"groups":[{"name":"Test","members":[]}]}
进入这个:eyJjb25maWd1cmF0aW9uIjp7InNob3AiOnsibmFtZSI6IiIsImFkZHJlc3NMaW5lMSI6IiIsImFkZHJlc3NMaW5lMiI6IiIsInBvc3RhbENvZGUiOiIiLCJjaXR5IjoiIiwiY291bnRyeSI6IiIsInBob25lTnVtYmVyIjoiIn19LCJqb2ludEJldHMiOltdLCJncm91cHMiOlt7Im5hbWUiOiJUZXN0IiwibWVtYmVycyI6W119XX0=
2º 我将它以 utf8 格式存储在磁盘上
3º 我从磁盘中检索它,它是这个字符串:
eyJjb25maWd1cmF0aW9uIjp7InNob3AiOnsibmFtZSI6IiIsImFkZHJlc3NMaW5lMSI6IiIsImFkZHJlc3NMaW5lMiI6IiIsInBvc3RhbENvZGUiOiIiLCJjaXR5IjoiIiwiY291bnRyeSI6IiIsInBob25lTnVtYmVyIjoiIn19LCJqb2ludEJldHMiOltdLCJncm91cHMiOlt7Im5hbWUiOiJUZXN0IiwibWVtYmVycyI6W119XX0=
4º 我解码它并得到异常。
【问题讨论】:
-
你为什么不
encodeToString?但试过你的代码(jshell)工作正常 -
getBytes()可能是个问题,因为它使用系统的本地默认字符集。在不同的系统上可能会有所不同。 -
Base64.getMimeEncoder()...getMimeDecoder()(或/和更改从磁盘写入/读取的方式) -
而不是
Base64.getEncoder()你写Base64.getMimeEncoder()- 这些忽略无效字符:"MIME ...所有行分隔符或其他在 base64 中找不到的字符解码操作中忽略字母表"