有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

加密编写一个加密的Java程序。具有整数键的txt文件

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

所以我需要写两个方法,加密和解密。 我的加密功能是:

 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;

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


共 (3) 个答案

  1. # 1 楼答案

    将while函数更改为:

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

    当前您读取了两次,第一次在while条件中,第二次在循环中,因此跳过了1个字符

  2. # 2 楼答案

    您正在读取字节(每个字节都转换为整数)

    但是String不是字节数组,而是包含Unicode文本,可以组合希腊语、汉语和其他任何语言。(事实上String使用char,其中每个字符都是两个byte。)对于具有某些字符集编码的外部字节,需要进行转换。这将出错,占用更多内存,速度较慢。因此,这里通常不使用字符串

    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(按位和255,0b1111_1111)

    请注意println(someInt)会将文本表示写入一个整数,“a”即int 65将被存储为“65”-2个字节:56和55

  3. # 3 楼答案

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

    所以说吧。read()为您提供97(ASCII表示“a”),您的密钥为5,您正在转过身,将102逐字写入文件,而不是“f”,它将是“编码”字符

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

    下面是ByteArrayOutputStream的文档,循环应该将其写入,然后可以将其写入文件