我正面临这个奇怪的问题.我使用“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); }}
首先,我将加密的单词保存到文件中,然后尝试解码保存的单词.这在上述两种情况下给出了两种不同的输出.
有没有什么办法解决这一问题?
解决方法:
从根本上说,Character.reverseBytes给你一个有点任意的UTF-16代码单元.无法保证您之后获得的字符将形成有效字符串 – 例如,可能存在“一半”代理项对,或者在Unicode中没有任何特定含义的字符.
更重要的是,当您将“文本”写入文件并将其读回时,您将获得不同的值 – 特别是在您未指定编码时.您正在使用的默认编码很可能无法支持您最终使用的字符.
从根本上说,你不想做任何这样的事情.字符串的加密应基本上采取以下形式:
>将字符串编码为固定编码的字节(例如UTF-8)
>加密二进制数据(请不要自己动手; Java包含大量加密工具)
>将加密的二进制数据传递到您需要的任何位置.如果必须将二进制数据表示为字符串,请使用类似base64的内容,以确保以后可以恢复确切的二进制数据.
然后解密,你反转每个操作:
>检索加密的二进制数据,这可能涉及从base64转换回来
>根据您之前使用的加密算法执行适当的解密步骤(二进制到二进制)
>使用您在开始时使用的相同编码将结果(仍然是字节)转换回字符串
将任意二进制数据作为文本处理 – 这实际上是Character.reverseBytes正在以非常粗糙的方式进行 – 是一个非常糟糕的主意.
来源:https://www.icode9.com/content-1-366701.html联系客服