gpt4 book ai didi

java - Java 字符 reverseBytes 中的问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:30:16 24 4
gpt4 key购买 nike

我遇到了这个奇怪的问题。我使用 "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 正在做的事情,以一种非常粗暴的方式 - 是一个非常糟糕的主意。

关于java - Java 字符 reverseBytes 中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12685332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com