方法字符串到字节

时间:2011-11-15 16:52:28

标签: java string byte

我整天都在努力寻找答案,所以最后我写到这里。 我用类crypto加密一个字符串,我得到一个byte []。 我必须使用tostring()将此字节转换为字符串,以便在一个Web中上传。 我需要获取此字符串,解密并获取原始字符串。 我的问题是关于getBytes,它不会返回相同的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 []。 感谢。

6 个答案:

答案 0 :(得分:3)

你误解了以下一行

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

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

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

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

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

@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);
}

答案 1 :(得分: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兼容字符串,以便它与世界所知道的几乎所有正常字符编码兼容。

答案 2 :(得分:2)

  

我必须使用tostring()将此字节转换为字符串,以便在一个网站上传

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

问题可能正在发生,因为JDK无法正确识别字符集。 使用声明:

public byte[] getBytes(String charsetName)

指定要使用的字符集。这可能有所帮助。我认为没有其他理由可以返回不同的字节数组。