我要将TEA加密的结果(字节[])转换为字符串,然后再次将其转换为字节[],并检索相同的字节[]。
//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);
输出是:
&h?7?"?PAtj??I??Z`H-jK?????f
&h?7?"?PAtj??I??Z`H-jK?????f
Are two byte arrays equal ? : false
所以,看起来两个字节[]在打印时是相同的,但它们与我们看到的"假"不完全相同,这是我在之后执行的解密的一个问题。
我还试图发送一个String with new String(byte[]),但当我们想把它转换回一个字节〔0〕时,它也有同样的问题。
我希望在开始和转换之后有完全相同的字节[]->string->byte[]
你是否有解决方案或理解我在转化过程中所做的错误?
查看这两个链接,可能会有所帮助:字符串到字节,反之亦然,另一个链接
不要试图从byte[]转换为String,就像它是常规编码的文本数据一样——它不是。它是一个任意字节数组。
最简单的方法是将其转换为base64或hex,这将导致ASCII文本可以可逆地解码回相同的二进制数据。例如,使用公共域base64编码器:
String dataToSend = Base64.encodeBytes(encryptedDataSent);
...
byte[] encryptedDataReceived = Base64.decode(receivedText);
谢谢你的回答。但是,如果我需要将byte[]数据写入文本文件,然后能够复制文本,将其粘贴到字段中,并以什么格式检索数据,我应该将byte[]数据存储在文本文件中?
@R&233;DABK:我会使用base64来实现这一点,正如我所展示的那样。
谢谢你@jonsket成功了!base64编码给了我这样一个字符串(aaaksvmmva75daqf+xufydnbdrhljlsv8o+fl7zofe5rdeov5eixrq‌&8203;bgy2fgqvvwq==),然后我又能将它转换为原始字节[]。为什么这个字符串编码对于正确的字节转换有效,而不是其他的?疑惑的。。。
尝试在解密中使用byte[]encode=base64.encode(bytestostore,base64.default)
不能。String不是二进制数据的容器。它是一个utf-16字符的容器。字符和字节之间的往返没有任何保证。
你不能这样做,但是你不能把任意的二进制数据表示为文本,然后再将其转换回相同的二进制数据的想法显然是有缺陷的…十六进制,base64,base32…有很多种方法。
尝试显式指定字符集。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
}
}
请注意,当字节数组保持不变时,您将得到完全相同的结果。
不,当数据是任意二进制数据,而不是UTF-8编码文本时,UTF-8是不好的。OP希望将加密结果转换为文本。这不是UTF-8编码的文本。