Вывод в файлы верный (насколько я смог протестировать)
подробности в комментариях к коду))
рассчитываю на вашу помощь😀
метод compareFile() для удобства - можно туда аргументы вставить )
package com.javarush.task.task18.task1826;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
/*
Шифровка
*/
public class Solution {
public static void main(String[] args) throws IOException {
magic(args[0], args[1], args[2]); // передаем аруметы в метод , пусть он разбирается
//magic("-e","C:\\Users\\waumo\\Documents\\test File\\123456.txt", "C:\\Users\\waumo\\Documents\\test File\\123.txt");
//magic("-d","C:\\Users\\waumo\\Documents\\test File\\123.txt", "C:\\Users\\waumo\\Documents\\test File\\456.txt");
//compareFile(); // метод сравнивает мои файлы до шивровки и после РАСШИФРОВКИ (true or false) (не зашифрованные файлы)
}
public static void magic(String EorD, String file, String result) throws IOException {
try (FileInputStream fileIn = new FileInputStream(file);
FileOutputStream fileOut = new FileOutputStream(result)) {
byte[] bytes = new byte[fileIn.available()];
if (EorD.equals("-e")) { // если фаил не насиловал мой сумашедший код - насилуем)
bytes = Arrays.copyOf("MyCypher \u00A9 ;)\n".getBytes(), fileIn.available() + 15); //добавляем к размеру массива 15 байт - для подписи шифра
while (fileIn.available() > 0) {
fileIn.read(bytes, 15, fileIn.available()); // читаем в масив после подписи с 16 бита и далее
}
for (int i = 15; i < bytes.length; i++) {
bytes[i] = (byte) ((bytes[i] ^ 2) ^ 6); // шифруем все кроме пописи , а имменно меняем 2ой и 6ой бит на противоположный
}
fileOut.write(bytes); //пишем в фаил - (даже Штирлиц не разгадает это Шифр))))
} else if (EorD.equals("-d")) { // если фаил уже насилован моим кодом, изнасилуем обратно))
fileIn.skip(15); // выкидываем эту дурацкую подпись
while (fileIn.available() > 0) {
fileIn.read(bytes); // читаем в массив
}
for (int i = 0; i < bytes.length - 15; i++) {
bytes[i] = (byte) ((bytes[i] ^ 2) ^ 6); // меняем биты обратно - да, алгоритм простой как ветка, и работает тудой и сюдой без изменений))
/*все подозрения падают на эту строку, так как я байты 0-255 привожу к байтам -128-127
что поделать если все операции инт или лонг
(вот только вывод в фаил верный, если ошибка здесь, просьба пожалуйста пояснить) */
}
fileOut.write(bytes, 0, bytes.length - 15); // пишем в фаил выкидываем элементы которые раньше занимала подпись - мне так спокойнее))
}
/*дальше код делающий тоже самое без танцев с бубном и подписей P.S. - его валидатор тоже не хочет любить*/
// if (EorD.equals("-e")) {
// while (fileIn.available() > 0) {
// fileOut.write(((fileIn.read() ^ 2) ^ 6));
// }
// } else if (EorD.equals("-d")) {
// while (fileIn.available() > 0) {
// fileOut.write(((fileIn.read() ^ 2) ^ 6));
// }
// }
}
}
public static void compareFile ()throws IOException{
FileInputStream file0 = new FileInputStream("C:\\Users\\waumo\\Documents\\test File\\123456.txt");
FileInputStream file1 = new FileInputStream("C:\\Users\\waumo\\Documents\\test File\\456.txt");
byte[] bytesFile0 = new byte[file0.available()];
byte[] bytesFile1 = new byte[file1.available()];
while (file0.available() > 0) {
file0.read(bytesFile0);
}
while (file1.available() >0){
file1.read(bytesFile1);
}
System.out.println(Arrays.equals(bytesFile0,bytesFile1));
}
}