我整天都在努力寻找答案,所以最后我写到这里。 我用类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 []。 感谢。
答案 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)
指定要使用的字符集。这可能有所帮助。我认为没有其他理由可以返回不同的字节数组。