我很抱歉这个令人困惑的标题,但我无法弄清楚如何用更好的标题来描述我的问题。
我正在编写一个程序,将一个字符串转换为一个应该是可逆的长向量(以便读回信息)。转换为长阵列对我来说似乎没问题。我使用base 64作为中间步骤,以便以更好的方式创建字节数,以处理我必须执行的其他处理部分。
public long[] str2long(String s)
{
final byte[] authBytes = s.getBytes(StandardCharsets.UTF_8);
final String encoded = Base64.getEncoder().encodeToString(authBytes);
long[] array = new long[encoded.length()];
int i=0;
for(char c: encoded.toCharArray()){
array[i] = (long) c;
// System.out.print(array[i] + " ");
i++;
}
return array;
}
问题在于,即使很难,下面的代码似乎与上面的代码完全相反,实际上它并非如此,并且基本64反向转换会出现此错误:Illegal base64 character 5b
。
public String long2str(long[] array)
{
char[] chArray = new char[array.length];
int i=0;
for(long c: array){
chArray[i] = (char) c;
i++;
}
String s = Arrays.toString(chArray);
final byte[] decoded= Base64.getDecoder().decode(s);
try {
s = new String(decoded, "UTF-8");
return s;
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(Encryption.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
所以,我的问题是:
我遗漏的第二种方法有什么不同?我想它可能是StandardCharsets.UTF_8
,但我不确定。
如何让这个功能long2str(long[] array)
像这样工作
long2str(str2long(String s)) == String s
?
如果您愿意,我可以发布我正在使用的测试用例来尝试验证此代码。
答案 0 :(得分:1)
在long2str
方法中,更改:
String s = Arrays.toString(chArray);
为:
String s = new String(chArray);
当您使用Arrays.toString()
时,您将获得String
格式的[Y, W, J, j, Z, G, V, m, Z, 2, h, ...]
,这不是有效的基本64字符串。要获取包含String
所有字符的chArray
,您应该使用相应的String
构造函数。