java中字符串的字节数组

java中字符串的字节数组,java,bytearray,Java,Bytearray,我想将salt转换为字符串以存储/读取。我好像没办法让它起作用。我读到我需要使用正确的编码,但我不确定使用什么编码。我尝试了以下操作,但收到了垃圾邮件: SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); byte[] salt = new byte[16]; random.nextBytes(salt); 编辑:对于上下文,我正在努力理解代码。我正在尝试查看salt和密码,这样我就可以用代码来蒙混过关了 您需要使用(Apac

我想将salt转换为字符串以存储/读取。我好像没办法让它起作用。我读到我需要使用正确的编码,但我不确定使用什么编码。我尝试了以下操作,但收到了垃圾邮件:

SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[16];
random.nextBytes(salt);

编辑:对于上下文,我正在努力理解代码。我正在尝试查看salt和密码,这样我就可以用代码来蒙混过关了

您需要使用(Apache Commons)类或sun.misc.BASE64Encoder/BASE64Decode对字节数组进行编码。

正如AVD所说,解决方案是使用Base64编码或其他二进制作为文本编码。(例如,十六进制编码。)

为什么??因为二进制数据不是文本

您当前正在做的是告诉字符串构造函数,字节是已正确编码为UTF-8或UTF-16的文本,或者(在最后一种情况下)平台的默认编码。这显然是错误的。你看到的“垃圾”是你试图将随机二进制内容解码为文本时得到的


更糟糕的是,当您将其应用于随机二进制数据时,解码过程可能是有损的。例如,如果您试图将某些字节序列视为UTF-8,那么它们就是无效的。(UTF-8的规范是这样说的!)当UTF-8解码器看到其中一个无效序列时,它会将其替换为一个表示“无效字符”的字符(例如
?”
)。如果您随后将字符串中的字符转换回字节,您将获得与开始时不同的字节序列。对于您的用例来说,这可能是一场灾难。

您期望什么?“垃圾”看起来像什么,与您的期望相比如何?我建议使用Base64或仅使用
Integer.toHexString
将字节表示为
String
您正在将随机字节转换为字符串-当然这是毫无意义的。而且,它可能是无效的UTF-8,而且它也很有可能是无效的UTF-16。(因为它们都必须表示基本上21位字符集中的字符,所以当一个字符由一个或两个以上字节表示时,就有了一个序列。)不惜一切代价避免使用sun.misc类。它们不是java语言规范的一部分,也可能不存在于所有JVM中。特别是,如果您在Websphere或Weblogic上运行东西,那么您就没有使用oracle jvm。@Matt我觉得很恼人的是,经过这么多年,Sun(现在是oracle)没有费心在核心Java包中包含默认的Base64实现。
String s = new String(salt, "UTF-8");
String s = new String(salt, "UTF-16");
String s = new String(salt);