[英]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.