Как вы вводите массив целых чисел и символов в метод, который требует символов и чисел - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть два класса, которые делают две разные вещи. Я пытаюсь заставить мой класс FileAccess использовать мой класс шифрования для кодирования заданного количества фраз в текстовом файле. Первые 10 чисел в файле дают программе значение ключа, и оно должно храниться в виде целого числа, а то, что следует после файла, должно храниться в виде массива символов, и те, которые должны вызываться классом шифрования для кодирования фразы. Я не знаю, почему я не могу назвать свой класс шифрования, и я в тупике.

Извините за непонятность. Я пытаюсь разработать код, который будет принимать несколько фраз в качестве входных данных и позволять пользователю шифровать его с помощью ключа шифрования. Этот ключ должен состоять из целого числа от -2000000 до + 2000000. Алгоритм шифрования использует ключ для смещения букв алфавита вправо или влево. Например, кодирование с ключом 3 приведет к получению D трех букв справа от алфавита. Если ключ настолько велик, что новая буква проходит за конец алфавита, программа должна перейти к букве рядом с началом алфавита.

Класс FileAccess - этот класс должен читать несколько фраз из файл. Первая строка файла должна содержать целое число, указывающее количество фраз в файле. Первые 10 символов каждой фразы в файле должны содержать ключ шифрования, который будет использоваться в процессе шифрования и дешифрования для этой фразы. Этот класс должен обеспечивать способ доступа к этой информации другими классами. Наконец, у этого класса должен быть второй метод, позволяющий сохранять фразы в новый файл. Я старался быть настолько ясным, насколько могу сейчас. Моя проблема в том, что я не могу вызвать свой метод кодирования в своем классе шифрования. Вот код для доступа к файлу.

public class FileAccess {
    public static String[] load(String fileName) throws IOException {
        FileReader file = new FileReader(fileName); //open file for reading
        BufferedReader input = new BufferedReader(file);

        int sizeF = Integer.parseInt(input.readLine()); // variable for the size of the array
        String infoInFile[] = new String[sizeF]; // declare and create a string array

        for (int i = 0; i < sizeF; i++) { // loop to read the file into the array
            infoInFile[i] = input.readLine();
        }
        input.close();//close the file 
        return infoInFile;
    }

    public static int[] key(String finalKey[]) {
        int finaloutput[] = new int[5];
        String temp;

        for (int i = 0; i < finalKey.length; i++) {
            temp = finalKey[i].substring(0, 11);
            finaloutput[i] = Integer.parseInt(temp);
            System.out.println(finaloutput[i]);

        }

        return finaloutput;
    }

    public static char[] phrase(String EndOfPhrase[]) {
        char letter[] = new char[5];

        for (int j = 0; j < EndOfPhrase.length; j++) {
            String phrase;
            phrase = EndOfPhrase[j].substring(11);
            char temp = phrase.charAt(1);
            letter = phrase.toCharArray();
            System.out.println(letter);
        }

        return letter;
    }

    public static void main(String[] args) throws IOException {
        String output[]; // call the loader
        int[] keyTest;
        char[] phraseTest;
        String display;

        output = FileAccess.load("phrase.txt");
        keyTest = key(output);
        phraseTest = phrase(output);

        for (int i = 0; i < output.length; i++) {
        }
    }
}

Я не уверен, должен ли я иметь это для l oop, но ограничить шифрование Метод кодирования принимает только 1 символ за раз и коды, я думаю, мне нужно, чтобы l oop продолжал называть его

ЗДЕСЬ КОД ДЛЯ КОДА шифрования

 public class Encryption {

    public static boolean isNotALetter(char character) { // returns false if the character is a letter
        boolean yorn = false;

        return yorn;
    }

    public static char encode(char letter, int key) { // returns an encrypted character
        char encryptedcharacter = 0;
        int truevalueofkey = 0;
        int valueofletter;
        int newvalueofletter;

        valueofletter = Encryption.lettertovalue(letter);

        truevalueofkey = key % 26;

        newvalueofletter = (valueofletter + truevalueofkey)%26;

        encryptedcharacter = Encryption.valueToLetter(newvalueofletter);

        // add truevalueofkey to key to get

        return encryptedcharacter;
    }

    public static char decode(char letter, int key) { // returns a decrypted character
        char decodedcharacter = 0;
        int dtruevalueofkey = 0;
        int dvalueofletter;
        int dnewvalueofletter;

        dvalueofletter = Encryption.lettertovalue(letter);

        dtruevalueofkey = key % 26;

        dnewvalueofletter = (dvalueofletter - dtruevalueofkey)%26;

        decodedcharacter = Encryption.valueToLetter(dnewvalueofletter);

        return decodedcharacter;
    }

    public static int lettertovalue(char letter) { // get value of each letter ex A = 1
        int value = 0;

        // convert to string based on char
        switch (letter) {
        case 'a': {
            value = 1;
            break;
        }
        case 'b': {
            value = 2;
            break;
        }
        case 'c': {
            value = 3;
            break;
        }
        case 'd': {
            value = 4;
            break;
        }
        case 'e': {
            value = 5;
            break;
        }
        case 'f': {
            value = 6;
            break;
        }
        case 'g': {
            value = 7;
            break;
        }
        case 'h': {
            value = 8;
            break;
        }
        case 'i': {
            value = 9;
            break;
        }
        case 'j': {
            value = 10;
            break;
        }
        case 'k': {
            value = 11;
            break;
        }
        case 'l': {
            value = 12;
            break;
        }
        case 'm': {
            value = 13;
            break;
        }
        case 'n': {
            value = 14;
            break;
        }
        case 'o': {
            value = 15;
            break;
        }
        case 'p': {
            value = 16;
            break;
        }
        case 'q': {
            value = 17;
            break;
        }
        case 'r': {
            value = 18;
            break;
        }
        case 's': {
            value = 19;
            break;
        }
        case 't': {
            value = 20;
            break;
        }
        case 'u': {
            value = 21;
            break;
        }
        case 'v': {
            value = 22;
            break;
        }
        case 'w': {
            value = 23;
            break;
        }
        case 'x': {
            value = 24;
            break;
        }
        case 'y': {
            value = 25;
            break;
        }
        case 'z': {
            value = 26;
            break;
        }
        }
        return value;
    }

    public static char valueToLetter(int value) {

        char letter = 0;

        if (value == 1) {
            letter = 'a';
        }
        if (value == 2) {
            letter = 'b';
        }
        if (value == 3) {
            letter = 'c';
        }
        if (value == 4) {
            letter = 'd';
        }
        if (value == 5) {
            letter = 'e';
        }
        if (value == 6) {
            letter = 'f';
        }
        if (value == 7) {
            letter = 'g';
        }
        if (value == 8) {
            letter = 'h';
        }
        if (value == 9) {
            letter = 'i';
        }
        if (value == 10) {
            letter = 'j';
        }
        if (value == 11) {
            letter = 'k';
        }
        if (value == 12) {
            letter = 'l';
        }
        if (value == 13) {
            letter = 'm';
        }
        if (value == 14) {
            letter = 'n';
        }
        if (value == 15) {
            letter = 'o';
        }
        if (value == 16) {
            letter = 'p';
        }
        if (value == 17) {
            letter = 'q';
        }
        if (value == 18) {
            letter = 'r';
        }
        if (value == 19) {
            letter = 's';
        }
        if (value == 20) {
            letter = 't';
        }
        if (value == 21) {
            letter = 'u';
        }
        if (value == 22) {
            letter = 'v';
        }
        if (value == 23) {
            letter = 'w';
        }
        if (value == 24) {
            letter = 'x';
        }
        if (value == 25) {
            letter = 'w';
        }
        if (value == 26) {
            letter = 'z';
        }

        return letter;

    }

    public static void main(String[] args) {

        String yrn = "y";

        while (yrn  == "y") {
            String alsdjkf = JOptionPane.showInputDialog(null, "Enter the letter");
            char enchar = alsdjkf.charAt(0);
            int keyr = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter the key"));
            char newchar = Encryption.decode(enchar, keyr);
            JOptionPane.showMessageDialog(null, newchar);
            yrn = JOptionPane.showInputDialog(null, "yes or no");
        }

    }

}

Это это то, что находится в текстовом файле:

2
00000000003 The cook worked 12 hours in the darkened kitchen!

00000000025 Did Fred look well? That’s it!

1 Ответ

0 голосов
/ 27 февраля 2020

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

  1. FileAccess.load не требуется. Вы можете использовать Files.lines, чтобы получить все строки в файле одним оператором (используйте Stream.toArray, если вам действительно нужно, чтобы он был в массиве).

  2. Массивные операторы switch просто повернуть char на int не нужно. Вы можете выполнить математику для char значений, таких как letter - 'a', чтобы упростить их.

  3. Используйте регулярное выражение, а не декодируйте каждую строку самостоятельно. "(\\d{10}) (.*)" будет читать ключ и фразу в одном выражении.

  4. Получив ключ и фразу, вы можете вызывать свой код «шифрования» для каждой строки.

И просто предупреждение: если вы вернетесь и скажете: «Мне не разрешено использовать X или Y в моем ответе», тогда мой комментарий будет «это было бы полезно знать, прежде чем я поставлю время». пытаясь помочь вам "!

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