Написание программы на Java, которая шифрует TXT-файлы с помощью целочисленного ключа. - PullRequest
0 голосов
/ 21 января 2019

Это мой первый вопрос по 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;

Но это не работает. Выходной файл не совпадает с исходным файлом без шифрования. Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 21 января 2019

in.read () считывает один байт файла как целое число.Затем вы конвертируете это целое число в строку через s + = b.

Так, скажем, in.read () дает вам 97 (ASCII для «a»), а ваш ключ равен 5, вы поворачиваетесь и пишете буквально102 в файл, вместо «f», который будет «закодированным» символом.

Ваш цикл должен создавать байтовый массив (или байтовый поток), и вы должны записать этот байтовый массив в файл.

Вот документы для ByteArrayOutputStream , в который должен записываться ваш цикл, который вы можете в свою очередь записывать в файл.

0 голосов
/ 21 января 2019

Вы читаете байты (каждый в целое число).

A 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.

0 голосов
/ 21 января 2019

Измените свою функцию while на следующее:

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

В настоящее время вы читаете дважды: первый раз внутри условия while и второй внутри цикла, поэтому вы пропускаете 1 символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...