到目前为止我做了什么:
我用文本读取file1,用键对字节进行异或,然后将其写回另一个文件2。 我的问题:我从file1读取了例如'H',字节值是72;
72 XOR -32 = -88 现在我写了-88到file2。 当我读取file2时,我应该得到-88作为第一个字节,但我得到-3。
Regex rgx2 = new Regex("(?<=NOM[\t])((.|\n)*)ADJ.*");
(?<=NOM[\t]) //preceded by "NOM "
((.|\n)*) // anything (should be "anything but NOM")
ADJ.* //finish with an adjective
答案 0 :(得分:1)
您不是以字节形式读取文件 - 您将其视为字符。加密数据不是有效的UTF-8编码文本,因此您不应该尝试将其读取。
同样,你不应该编写任意字节数组,就好像它们是UTF-8编码的文本一样。
基本上,您的方法有签名接受或返回任意二进制数据 - 根本不使用Writer
或Reader
类。只需将数据直接写入流。 (并且不要吞下异常 - 如果你没有写出重要的数据,你真的想继续吗?)
我实际上会完全删除您的readInput
和writeOutput
方法。相反,请使用Files.readAllBytes
和Files.write
。
答案 1 :(得分:0)
在 writeOutput 方法中,将加密的字节数组转换为UTF-8字符串,这会将稍后写入的实际字节更改为该文件。尝试使用此代码段查看当您尝试将具有负值的字节数组转换为UTF-8时发生的情况字符串:
final String s = new String(new byte[]{-1}, "UTF-8");
System.out.println(Arrays.toString(s.getBytes("UTF-8")));
它会打印[-17, -65, -67]
之类的内容。尝试使用OutputStream
将字节写入文件。
new FileOutputStream(file).write(encrypted);