【问题标题】:Convert byte[] salt to String in java在java中将字节[]盐转换为字符串
【发布时间】:2013-05-31 09:21:35
【问题描述】:

我正在尝试将 byte[] 格式的生成盐值转换为字符串。 但是每次它都会转换为特殊字符。

我使用以下方式将 byte[] 转换为 String :

byte[] salt = new byte[] { 50, 111, 8, 53, 86, 35, -19, -47 };
String saltString = new String(salt,"UTF-8");
System.out.println(saltString);

但输出类似于??@?

【问题讨论】:

  • 盐通常是二进制数据。是什么让你如此确定它应该编码一个字符串?
  • 你在找这个吗:StringBuilder sb = new StringBuilder(); for(byte b:salt){ char ch = (char)b; sb.append(ch); }
  • 盐是任意二进制数据,没有有意义的字符串表示。但是,如果您首先对它们进行 base64 编码,那么它们将完全可打印并代表相同的东西。

标签: java casting


【解决方案1】:

您可以使用 base64 编码进行转换。为此,您可以使用javax.xml.bind.DatatypeConverter.printBase64Binary 方法

例如:

    byte[] salt = new byte[] { 50, 111, 8, 53, 86, 35, -19, -47 };
    System.out.println(DatatypeConverter.printBase64Binary(salt));

我也想加这个answer

byte[] 和 String 之间的“正确转换”是显式地 说明您要使用的编码。如果你从一个 byte[] 开始,它 实际上不包含文本数据,没有“适当的转换”。 字符串用于文本,byte[] 用于二进制数据,唯一真正的 明智的做法是避免在它们之间进行转换,除非您 绝对必须。

【讨论】:

    【解决方案2】:

    您可以先将其转换为base64 并从中获取字符串。

    byte[] salt = new byte[] { 50, 111, 8, 53, 86, 35, -19, -47 };
    String encoded = new BASE64Encoder().encode(salt); 
    System.out.print(encoded);
    

    【讨论】:

    • 我会在这个答案中添加如何在 Java 中进行 base64 转换
    • 我将它转换为byte[] decoded = Base64.decodeBase64(sample);sysout(new String(decoded)),但现在它会将字符串值显示为“ÚŽU”。我错过了什么吗?
    • @Patashu 感谢您的反馈,添加了示例。
    • @NareshJ 您必须对其进行编码,而不是对其进行解码,我想您现在已经知道了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2012-11-22
    • 2016-06-03
    • 2022-01-18
    相关资源
    最近更新 更多