2016-05-23 133 views
1

我想将TEA加密(一个字节[])的结果转换为一个字符串,然后再将其转换为一个字节[]并检索相同的字节[]。在Java中,如何正确地将byte []转换为字符串为byte []?

//Encryption in the sending side 
String stringToEncrypt = "blablabla" 
byte[] encryptedDataSent = tea.encrypt(stringToEncrypt.getBytes()); 
String dataToSend = new BigInteger(encryptedDataSent).toString()); 

//Decryption side in the reception side 
byte[] encryptedDataReceived = new BigInteger(dataToSend).toByteArray(); 

然而,当我试试这个:

System.out.println(new String(encryptedDataSent)); 

System.out.println(new String(encryptedDataReceived)); 

boolean equality = Arrays.equals(encryptedDataReceived,encryptedDataSent); 
System.out.println("Are two byte arrays equal ? : " + equality); 

输出是:

& H7" PAtj݄IZ`H-JK 012f

&h 7 “tPAtj݄ I Z`H-jK f

两个字节数组是否相等? :false

因此,看起来两个字节[]在打印时是相同的,但它们与我们看到的“假”不完全相同,这是我在执行解密后出现的问题那。

我还尝试发送String with new String(byte[])但是当我们想将其转换回一个byte []它有同样的问题

我想有完全相同的字节[]在开始和转换后字节[] - >字符串 - >字节[]

您是否有解决方案或理解我在我的转换中出错?

+0

查看这两个链接,它可能会有所帮助:[字符串到字节,反之亦然](http://stackoverflow.com/questions/1536054/how-to-convert-byte-array-to-string-and - 反之亦然),[另一个链接](http://stackoverflow.com/questions/4318693/string-to-byte-and-vice-versa) –

回答

2

不要试图从byte[]转换为String就好像它是常规编码的文本数据 - 事实并非如此。这是一个任意的字节数组。

最简单的方法是将其转换为base64或hex - 这将导致ASCII文本可以被可逆地解码回相同的二进制数据。例如,使用一个public domain base64 encoder

String dataToSend = Base64.encodeBytes(encryptedDataSent); 
... 
byte[] encryptedDataReceived = Base64.decode(receivedText); 
+0

谢谢你的回答。但如果我的需要是将byte []数据写入文本文件,然后才能复制文本,请将其粘贴到字段中,并以什么格式检索数据,然后将byte []数据存储在文本文件中? –

+0

@RédaBk:我会用base64来做这件事,就像我之前展示的那样。 –

+0

谢谢@JonSkeet它的工作! Base64编码为我提供了一个这样的字符串(AAAAKSvMGMmVa75daqF + XuFyDdnbDrhljLsv8o + fl7ZOfE5rdEOVv5EIxrQBGy2FgQVVwQ ==),然后我可以再次将它转换为原始字节[]!为什么这种字符串编码适用于正确的字节转换而不是其他字符?想知道...... –

0

你不能。 String不是二进制数据的容器。它是UTF-16字符的容器。字符和字节之间的往返无处保证。

+0

你不能这样做*就像那样*,但想法你不能将任意二进制数据表示为文本,然后将其转换回相同的二进制数据显然是有缺陷的......十六进制,base64,base32 ......存在任意数量的方式。 –

1

尝试在解密使用 字节[]编码= Base64.encode(bytesToStore,Base64.DEFAULT)

-1

尝试显式地指定字符集。 UTF-8是确定的重大案件:

public static void main(String[] args) { 
    String in = "幸福"; 
    try { 
     byte[] bytes = in.getBytes("utf-8"); 
     String out = new String(bytes, "utf-8"); 
     System.out.println(in + " -> " + out); 
     System.out.println("equals: " + out.equals(in)); 
    } catch (UnsupportedEncodingException unsupportedEncodingException) { 
     // do something 
    } 
} 

请注意,当你的字节数组保持不变,你会得到完全相同的结果。

+0

不,utf-8是* not * okay,当数据是任意的二进制数据时,而不是UTF-8编码的文本。 OP想要将加密结果转换为文本。这是*不* UTF-8编码的文本。 –