请不要将其标记为重复。
我正在使用Blowfish算法来加密和解密文件中的内容。问题是加密文件的输出字符有太多特殊字符
特殊字符(加密文字): - Z81‡Ç¬ú²±DN¢÷HÜ4ºÜºT+ .E SA
之后我将特殊字符转换为十六进制,它将值赋予
8E383187C7ACFAB214B113444EA248DC34BADCBA54F7032ECA2B8AC03C6B95C67D2F46F586E4CD86
如果我试图将其转换为字符串,则无法获得相同的加密文本
以下用于将十六进制转换为字符串的java代码
package bytearray;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import javax.xml.bind.DatatypeConverter;
public class ByteArray {
public static byte[] toByteArray(String s) {
return DatatypeConverter.parseHexBinary(s);
}
public static void main(String[] args) throws IOException {
String balaji ="8E383187C7ACFAB214B113444EA248DC34BADCBA54F7032ECA2B8AC03C6B95C67D2F46F586E4CD86";
byte[] pri = toByteArray(balaji);
String value = new String(pri);
System.out.println(value);
}
}
请帮助我们如何将十六进制转换为字符串。
预期产出: - Z81‡Ç¬ú²±DN¢÷HÜ4ºÜºT+ .E SA
获得的输出: - 81ǬDNH4ܺT. +
答案 0 :(得分:0)
您需要确保与HEX之间的转换使用相同的编码。在这种情况下,我认为它应该是UTF-8
public static String toHexString(String arg,String encoding) throws Exception {
return String.format("%040x", new BigInteger(1, arg.getBytes(encoding)));
}
public static byte[] toByteArray(String s) {
return DatatypeConverter.parseHexBinary(s);
}
public static void main(String[] args)throws Exception{
String s1 = "Ž81‡Ç¬ú²±DN¢HÜ4ºÜºT÷.Ê+ŠÀ";
System.out.println(s1);
String s2 = toHexString(s1,"UTF-8");
System.out.println(s2);
String s3 = new String(toByteArray(s2));
System.out.println(s3);
String s4 = toHexString(s1,"ISO-8859-15");
System.out.println(s4);
String s5 = new String(toByteArray(s4));
System.out.println(s5);
}
<强>输出:强>
Z81‡Ç¬ú²±DN¢÷HÜ4ºÜºT+ .E SA
c5bd3831e280a1c387c2acc3bac2b2c2b1444ec2a248c39c34c2bac39cc2ba54c3b72ec38a2bc5a0c380
Z81‡Ç¬ú²±DN¢÷HÜ4ºÜºT+ .E SA
b438313fc7acfab2b1444ea248dc34badcba54f72eca2ba6c0
81?ǬDNH4ܺ吨。+
正如您在UTF-8
和encode
使用decode
时在输出中看到的那样,我得到了正确的结果,但是当encode
带有ISO
和{时{1}} decode
我得到了你得到的东西。