我正面临着这个奇怪的问题。我使用"Character.reverseBytes(char ch)"
方法进行加密。在NetBeans
内运行时,它工作正常。但每当我试图在外面运行它时,它会产生奇怪的输出。
我认为问题是在两种情况下,它使用两种不同的编码方法(或类似的东西)。以下代码演示了此问题。
import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
public class Encryptor {
public static String encode(String in) {
ArrayList<Character> list = new ArrayList<Character>();
for (int i = 0; i < in.length(); i++) {
list.add(Character.reverseBytes(in.charAt(i)));
}
return arrayToString(list);
}
public static String decode(String in) {
ArrayList<Character> list = new ArrayList<Character>();
for (int i = 0; i < in.length(); i++) {
list.add(Character.reverseBytes(in.charAt(i)));
}
return arrayToString(list);
}
private static String arrayToString(ArrayList<Character> list) {
char[] ch = new char[list.size()];
for (int i = 0; i < list.size(); i++) {
ch[i] = list.get(i);
}
return String.copyValueOf(ch);
}
public static void main(String[] args) throws java.io.FileNotFoundException, java.io.IOException {
String pass = "Password";
String passEn = encode(pass);
File file = new File(System.getProperty("user.dir") + "/pass.txt");
file.createNewFile();
PrintWriter pr = new PrintWriter(file);
pr.write(passEn);
pr.flush();
passEn = new java.util.Scanner(file).next();
String passDe = decode(passEn);
String msg;
msg = "Initial : " + pass
+ "\nEncrypted : " + passEn
+ "\nDecrypted : " + passDe;
javax.swing.JOptionPane.showMessageDialog(null, msg);
}
}
首先,我将加密的单词保存到文件中,然后尝试解码保存的单词。这在上述两种情况下给出了两种不同的输出。
有什么方法可以解决这个问题吗?
答案 0 :(得分:7)
从根本上说,Character.reverseBytes
给你一个有点任意的UTF-16代码单元。无法保证您之后获得的字符将形成有效的字符串 - 例如,可能有“一半”代理项对,或者在Unicode中没有任何特定含义的字符。
更重要的是,当您将“文本”写入文件并将其读回时,您将获得不同的值 - 特别是在您未指定编码时。您使用的默认编码很可能无法支持您最终使用的字符。
从根本上说,你不想做任何这样的事情。字符串的加密应基本上采用以下形式:
然后解密,你反转每个操作:
将任意二进制数据作为文本处理 - 这实际上是Character.reverseBytes
正在以非常粗糙的方式进行的操作 - 是一个非常糟糕的主意。