Нужна помощь в использовании bytearray, io.file, fileinputstream и fileoutputstream при создании столбчатого шифра - PullRequest
0 голосов
/ 20 октября 2019

Я с трудом пытался создать столбчатый шифр, включающий бинарный файл любой формы, и сохранять его в многомерном байт-массиве. В настоящее время я застрял при попытке сохранить файл в bytearray (версия с файлами) и распечатать bytearray по вертикали, не теряя при этом некоторые символы с учетом пробелов в String.

Я пытался найти другие реализации Columnar. шифр. Однако они не использовали bytearray и использовали заполнители для заполнения пустого пространства в пустых слотах в массиве. Я не могу сделать это на моем, так как эти вовлеченные файлы и пробелы также считаются байтами.

Тестовая версия, включающая строки.

    System.out.println("Enter your plaintext: ");
    String plaintext = sc.nextLine();

    System.out.println("Enter your key: ");
    String key = sc.nextLine();

    int col = key.length();

    int row = plaintext.length() / col;

    if(plaintext.length() % col == 1) {
        row += 1;
    }

    byte[][] ciphertext = new byte[row][col];

    int z = 0;

    for (int x = 0; x < row; x++) {
        for (int y = 0; y < col;) {
            ciphertext[x][y] = (byte) plaintext.charAt(z);  
            z++;
            y++;
        }
    }

    for (int i = 0; i < col; i++) {
        for (int j = 0; j < row; j++) {
            System.out.print((char) ciphertext[i][j]);
        }
    }
}

Версия, которая включает файлы.

    //User enters the file directory.
    System.out.print("Enter a file name: ");
    String filename = in.nextLine();

    //User enters the key.
    System.out.print("Enter your key: ");
    String key = in.nextLine();

    File file = new File(filename);

    int col = key.length();

    int row = (byte) file.length() / col;

    if (file.length() % col == 1) {
        row += 1;
    }

    byte[][] filebyte = new byte[row][col];

    try {
        FileInputStream fileInputStream = new FileInputStream(file);
        //FileInputStream.read(filebyte);

        int z = 0;

        for (int x = 0; x < row; x++) {
            for (int y = 0; y < col;) {
                filebyte[x][y] = (byte) file.length(z); 
                z++;
                y++;
            }
        }

        for (int i = 0; i < col; i++) {
            for (int j = 0; j < row; j++) {
                System.out.print((char) filebyte[j][i]);
            }
        }

        } 
        catch (FileNotFoundException e) {
            System.out.println("File Not Found.");
            e.printStackTrace();
        }
}

Тестовая версия, включающая строки с пробелами.

Введите ваш текст:

Hibiki Sakura

Введите ваш ключ:

thic

Исключение в потоке "main" java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: 13

    at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:47)

    at java.base/java.lang.String.charAt(String.java:702)

    at Columnar.main(Columnar.java:27)

Версия, включающая файлы. Использование file.length (). Demo.java:41: ошибка: длина метода в классе File не может быть применена к данным типам;filebyte [x] [y] = file.length (z);

Тип приведен к int. Demo.java:41: ошибка: несовместимые типы: возможное преобразование с потерями из int в байтовый файл byte [x] [y] = (int) file.length (z);

Типизация в байтах. Demo.java:41: ошибка: длина метода в классе File не может быть применена к данным типам;filebyte [x] [y] = (байт) file.length (z);

...