我正在尝试从字节数组创建一个字符串,但它给了我一些随机值。字节数组是加密的,所以我不确定我是否正确解密。随机值看起来像 - [B @ 1uy3798。每次它给出不同的随机值。我怎么解决这个问题?
public class MainActivity {
public static void main(String[] args) {
Key publicKey = null;
Key privateKey = null;
byte[] encoded;
byte[] text = new byte[0];
try {
text = "This is my secret message".getBytes();
Cipher c = Cipher.getInstance("RSA");
c.init(Cipher.ENCRYPT_MODE, publicKey);
encoded = c.doFinal(text);
c = Cipher.getInstance("RSA");
c.init(Cipher.DECRYPT_MODE, privateKey);
text = c.doFinal(encoded);
} catch (Exception e) {
System.out.println("Exception encountered. Exception is " + e.getMessage());
}
System.out.println(String.valueOf(text)); //get random values here
}
}
答案 0 :(得分:2)
String.valueOf(text)
并不能按照您的想法行事。你想要的是new String(text)
。
String.valueOf(text)
返回指向数组的指针的字符串表示形式(其哈希码)。您希望将数组转换为String,因此请使用适当的构造函数。
要解释为什么要返回此值,您应该查看java.lang.Object中toString()的约定:
返回对象的字符串表示形式。一般来说, toString方法返回一个"文本表示"的字符串。这个 宾语。结果应该是简洁但信息丰富的表示 一个人很容易阅读。建议所有人 子类重写此方法。类Object的toString方法 返回一个字符串,该字符串由其类的名称组成 object是一个实例,at符号字符`@'和unsigned 对象哈希码的十六进制表示。其他 单词,此方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
要把它们放在一起,你得到 - [B @ 1uy3798因为[B是类字节[]的名称(如果你反汇编类文件,你会在字节码中看到这个),然后是& #39; @',然后是1uy3798。如果您再次运行该类并在byte []文本上调用hashCode(),您将看到哈希码与您在Toast中看到的值匹配。