【问题标题】:Method string to byte方法字符串到字节
【发布时间】:2011-11-16 07:54:54
【问题描述】:

我整天都在寻找答案,所以最后我写在这里。 我用加密类加密一个字符串,得到一个字节[]。 我必须用 tostring() 将这个字节转换成字符串,才能上传到一个网络中。 我需要得到这个字符串,解密并得到原始字符串。 我的问题是关于 getBytes,它不会返回相同的 byte[] 来解密。

我需要将原始字符串转换为 byte[],加密,获取返回的 byte[],转换为字符串,然后将该字符串转换为 byte[] 并获得相同的 byte[] 加密。

我会尽我所能尝试。 我需要一些方法,用一个字符串,总是返回相同的 byte[] 并且 getbytes 不会这样做。

我加一个例子:

      String s2="this is an example";
      byte[] b1=s2.getBytes("UTF-8");
      byte[] b2=s2.getBytes("UTF-8");
      System.out.println("Byte s:"+b1);
      System.out.println("Byte s:"+b2);

有一种方法可以从一个字符串中给出相同的字节[]? 使用 getBytes(至少在我看来)我获得了两个不同的字节 []。 谢谢。

【问题讨论】:

  • 抱歉,您的问题很难理解,可能是因为英语不是您的母语。你能发布一些代码来显示你在做什么以及你得到的不是你想要的吗?
  • 从 byte[] 解码到 String 时使用什么字符集,从 String 编码到 byte[] 时使用什么字符集?您必须对两者使用相同的字符集,否则您可能无法获得原始字节 []。
  • 这不是我的母语,抱歉。我发布了一个关于我的问题的例子。如果我这样写: String s="this is an example";字节[] b1=s.getBytes("UTF-8");字节[] b2=s.getBytes("UTF-8"); System.out.println("字节数:"+b1); System.out.println("字节数:"+b2);我获得了两个不同的字节。我需要一个字符串,我需要一个字节[],一个对称关系字节[]-->字符串-->字节[],两个字节都相等。我尝试了所有的字符集,默认值,UTF-8 ......我很关心编码和解码。谢谢你们。
  • @Jmm:在您的示例中,您将打印出在这种情况下不同的两个字节数组的地址。如果要检查内容是否相等,请使用Arrays.equals(b1, b2)。回归是真的吗?它应该用于相同的字符串和编码。
  • 您需要更多帮助来解决此问题吗?如果需要,请询问更多信息。

标签: java string byte


【解决方案1】:

你误解了下面这行

System.out.println("Byte s:"+b1);

这里我们隐式调用字节数组上的toString() 方法。这返回数组的内容。而是使用:

System.out.println("Byte s:" + java.util.Arrays.toString(b1));

这将向您显示可用于比较的字节数组的内容。

您对String.getBytes(String) 方法的使用很好。它返回两个不同的字节数组instances,但都具有相同的内容。

@Test
public void testGetBytes() throws Exception {
    String s2 = "this is an example";

    byte[] b1 = s2.getBytes("UTF-8");
    byte[] b2 = s2.getBytes("UTF-8");

    Assert.assertEquals(b1, b2);
}

【讨论】:

    【解决方案2】:

    您需要使用采用特定字符编码的String#getBytes(charsetName)

    byte[] bytes = string.getBytes("UTF-8");
    // ...
    

    然后,要重构字符串,您需要使用String(bytes, charsetName) 构造函数,该构造函数采用特定的字符编码。

    String string = new String(bytes, "UTF-8");
    // ...
    

    否则将使用平台默认字符编码将字符串中的字符解码为字节。平台默认字符编码不一定在所有平台上都相同。例如,一个平台可能使用 UTF-8,而另一个平台使用 CP1252 或 ISO-8859-1。

    或者,您可以使用Base64 将字节编码/解码为与 US-ASCII 兼容的字符串,以便它与世界上几乎所有已知的体面字符编码兼容。

    【讨论】:

    • 我试过这个方法getBytes,我遇到了我告诉的问题。我会试试base64,谢谢。
    • 那么你的问题是由其他地方引起的,并且可能无法通过 Base64 解决。如果没有您身边的 SSCCE,就不可能查明问题的原因。我最好的猜测是该字符串又是使用错误的编码通过网络写入的。也许您使用了一些 Writer 而不将其包装在 OutputStreamWriter 中,或者只是将 string.getBytes("UTF-8") 写入 OutputStream
    【解决方案3】:

    我必须用 tostring() 将这个字节转换成字符串,然后上传到一个网页中

    不,你没有。您可以很好地上传字节,实际上字节是您可以通过 HTTP 发送的唯一内容。在某些时候,您的字符串会被转换回字节,那么为什么不跳过只会破坏数据的额外转换呢?

    【讨论】:

    • 因为它是由我使用字符串上传的库指定的。
    【解决方案4】:

    是否可以省略到字符串的转换?我的意思是,您可以发送 byte[] 并接收 byte[]。或者您可以使用 base64 编码 byte[](生成一系列可打印字符),将其作为 String 发送,然后从 base64 解码回来并获得原始 byte[]。

    【讨论】:

    • 不可能省略转换,因为我使用库来上传信息并且它需要一个字符串。关于使用 base64 对字节 [] 进行编码,我没有尝试过,也许它可以工作。谢谢
    【解决方案5】:

    您是否尝试过通过显式指定编码来重新创建字符串并从中获取字节?

    final String newString = new String(bytes, utf8_charset);
    final byte[] bytes = oldString.getBytes(utf8_charset);
    

    【讨论】:

      【解决方案6】:

      这个问题可能是因为 JDK 无法正确识别字符集。 使用声明:

      public byte[] getBytes(String charsetName)
      

      指定要使用的字符集。这可能会有所帮助。我看不出它会返回不同字节数组的其他原因。

      【讨论】:

        猜你喜欢
        • 2016-03-28
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 2019-02-22
        • 2012-01-31
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多