String.valueOf()给出随机值

时间:2016-09-25 18:30:27

标签: java android encryption

我正在尝试从字节数组创建一个字符串,但它给了我一些随机值。字节数组是加密的,所以我不确定我是否正确解密。随机值看起来像 - [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
    }
  }

1 个答案:

答案 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中看到的值匹配。