簡體   English   中英

我如何通過一次遍歷兩個字符,在數組中找到它們並相互交換它們的cols來加密文本文件?

[英]How do I encrypt a text file by iterating through two chars at a time, finding them in an array and swapping the cols they are in with each other?

我正在嘗試編寫一個程序,該程序將在文本文件中讀取,刪除所有空格,句號,逗號或任何非字母的內容,然后將生成的字符存儲到字符數組中。 然后它將一次遍歷兩個字符。 然后,將使用這兩個字符並將它們定位在數組中,與其他兩個字符“交換”,然后打印出這些字符。 所討論的數組是二維數組。

該陣列有四個不同的象限; 左上角和右下角的字符按順序排列為A-Z(不包括J),右上角和左下角的字符按無序順序排列為A-Z(不包括J)。 該程序旨在在有序象限中找到兩個字符(第一個字母對應於左上象限,第二個字母對應於右下象限)。 根據這兩個字母的位置,它將通過交換“ P”“ O”的列在其他兩個象限中找到對應的字母:

'P' ,'W','D','R', 'C'

'U','Y','K','E','Q',

'Z','X','V','S','B',

'D','A','B','C','D',

'A','F','G','H','I',

'V' ,'L','M','N', 'O',

從該數組示例中可以看到,通過將“ P”所在的列與“ O”所在的列交換,反之亦然,然后轉到相同的行,您可以找到加密。

我在加密部分遇到了麻煩。 該程序能夠讀取文本文件,並使用正則表達式刪除所有不是字符的字符,並將字符存儲到字符數組中。 我覺得一次處理兩個字符的邏輯也已經完成。 我嘗試使用嵌套的for循環(兩次)來查看位置[i] [j]處的矩陣是否等於第一個字符(x),然后再次等於第二個字符(y)。 做我想做的事有好處嗎? 我需要使用列表嗎? 如果是這樣,那是什么? 下面是我到目前為止的代碼:

import java.util.List;
import java.io.*;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

public class FourSquareCipher {
    public static void main(String[] args) throws IOException {
        char[][] matrix = { 
                { 'A', 'B', 'C', 'D', 'E',  'Z', 'G', 'P', 'T', 'F' },
                { 'F', 'G', 'H', 'I', 'K',  'O', 'I', 'H', 'M', 'U' },
                { 'L', 'M', 'N', 'O', 'P',  'W', 'D', 'R', 'C', 'N' },
                { 'Q', 'R', 'S', 'T', 'U',  'Y', 'K', 'E', 'Q', 'A' },
                { 'V', 'W', 'X', 'Y', 'Z',  'X', 'V', 'S', 'B', 'L' },
                { 'M', 'F', 'N', 'B', 'D',  'A', 'B', 'C', 'D', 'E' },
                { 'C', 'R', 'H', 'S', 'A',  'F', 'G', 'H', 'I', 'K' },
                { 'X', 'Y', 'O', 'G', 'V',  'L', 'M', 'N', 'O', 'P' },
                { 'I', 'T', 'U', 'E', 'W',  'Q', 'R', 'S', 'T', 'U' },
                { 'L', 'Q', 'Z', 'K', 'P',  'V', 'W', 'X', 'Y', 'Z' } 
                };

        String fileName = "PoblachtNaHEireann.txt";
        String line = null;
        int bigram = 0;
        int a = 0, b = 0, c = 0, d = 0;
        int i, j;
        char x = 0, y = 0;
        long startTime = System.currentTimeMillis();
        long startTimeSeconds = TimeUnit.MILLISECONDS.toSeconds(startTime);

        FileReader fileReader = new FileReader(fileName);       
        BufferedReader bufferedReader = new BufferedReader(fileReader);


        while ((line = bufferedReader.readLine()) != null) {
            char[] fileToChar = line.replaceAll("(?:--|[\\[\\]{}(),.-: +/\\\\])", "").toUpperCase().toCharArray();

            for (char fileArray:fileToChar) {
                System.out.print(fileArray);
            }

            for (i = 0; i < line.length(); i += 2) {
                x = line.charAt(bigram);
                y = line.charAt(bigram + 1);
            }
        }

        System.out.println("Encryption time (s): " + ((System.currentTimeMillis() - startTimeSeconds) / 1000000000 / 1000));
        bufferedReader.close();
    }
}

是的,您的解決方案是正確的,但是您可以使用簡單的數學方法更快地完成。 考慮以下代碼( chr是要在矩陣中找到的字符):

int code = ((int)chr<(int)'J') ? (int)chr-(int)'A' : (int)chr-(int)'A'-1;
int row = code/5;
int col = code%5;

您首先計算字母的序數(即A = 0,B = 1,C = 2,...,I = 8,K = 9等)。 然后,您可以通過簡單的數學運算獲得行和列(在左上角的正方形中)。 如果要右下角正方形,只需將5加到兩個變量上即可。

編輯:您可以更快地執行此操作。 只需對所有可能的結果進行預壓縮(手動操作,因為並不困難):

int[] row_info = {0, 1, 2, 3, 4, 0, 1, 2, 3, 42, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4};
int[] col_info = {0, 0, 0, 0, 0, 1, 1, 1, 1, 42, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4};

接着:

int code = (int)chr - 65;
int row = row_info[code];
int col = col_info[code];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM