编写使用整数密钥加密.txt文件的 Java 程序



这是我关于StackOverflow的第一个问题。希望它能足够清晰和详细。

所以我需要编写 2 种方法,加密和解密。我的加密功能是:

 public void cifra() throws FileNotFoundException,IOException {
        FileInputStream in=new FileInputStream(file);
        String s="";
        int b;
        while(in.read()!=-1) {
            b=in.read()+key;
            s+=b;
        }
        in.close();
        PrintStream ps=new PrintStream(file);
        ps.println(s);
        ps.close();
 }

我的解密功能是相同的,但

b=in.read()-key;

但它不起作用。输出文件与未加密的初始文件不同。感谢您的帮助!

将 while 函数更改为:

while ((b = in.read()) != -1) {
    b += key;
    s += b;
}

目前您读取了两次,第一次是在 while condition 内,第二次是在循环内,因此您跳过了 1 个字符。

in.read() 在文件的单个字节中以整数形式读取。然后,通过 s+=b 将该整数转换为字符串。

所以说in.read()给你97(ASCII代表'a'),你的键是5,你转过身来,从字面上写102到文件中,而不是'f',这将是"编码"字符。

你的循环应该构建一个字节数组(或字节流),你应该将该字节数组写入文件。

以下是 ByteArrayOutputStream 的文档,您的循环应该写入它,您可以依次写入文件。

您正在读取字节(每个字节都读取到一个整数中)。

然而,String不是字节数组,而是包含 Unicode 文本,并且可以组合希腊语、中文等。(事实上,String使用 char s,其中每个字符都是两个byte s。对于具有一些字符集编码的外部字节,涉及转换。这将出错,使用更多内存并且速度很慢。因此,通常在这里不使用字符串。

FileInputStream in = new FileInputStream(file);
ByteArrayOutputStream out = new ByteArrayOutputStream();
int b;
while((b = in.read()) !=-1) {
    b = (b + key) % 256;
    out.write(b);
}
in.close();
byte[] data = out.toByteArray();
FileOutputStream out2 = new FileOutputStream(file);
out2.write(data);
out2.close();

另一个问题是字节的范围为 0 - 255(或有符号字节 -128 - 127)。因此我的%,模。人们也看到了& 0xFF(按位 AND 与 255,0b1111_1111)。

请注意,println(someInt)将文本表示形式写成整数,int 65 的"A"将存储为 "65" - 到 2 个字节:56 和 55。

最新更新