2015-09-19 124 views
0

我想要解密某個文本。當我遇到字符串中的一個字母時,我想用字母表中的下一個字母替換它。然後在接下來的一輪中,我希望替換下一個字母。用其他字符替換字符

甲 - >乙

的k - >升

然後在第二輪所以應儘量

一個 - >ç

的k - >米

問題帶字符的是它包含各種奇怪的字符,當你遇到az並試圖替換它時,它會被一個奇怪的符號替代。

任何人都可以幫我從A-Z製作某種循環列表?在下面的代碼片段中,我創建了一個包含a到z的列表。在循環中,一個字符被選中,索引被搜索和「調整」,新字符應該被恢復。但它不起作用。 (一個原因列表是不是圓形)

public static void decipher(){ 
    String cyphertext = "aVaqrprzoreoeratraWhyvhfraJnygreUbyynaqreqrgjrroebrefinaRqvguZnetbganneNzfgreqnzNaarjvytenntzrrxbzraznnezbrgabtrrarragvwqwrovwbznoyvwiraBznmnyurgzbrvyvwxuroorabzNaarabtrracnnejrxraqnnegrubhqrafpuevwsgRqvguSenaxvarraoevrsnnaTregehqAnhznaauhaiebrtrerohhezrvfwrvaSenaxshegnzZnva"; 
    char[] plaintext = new char[cyphertext.length()]; 

    List<Character> a2z = new ArrayList<Character>(26); 
    for (char c = 'A'; c <= 'Z'; c++){ 
     a2z.add(Character.valueOf(c)); 
    } 

    for(int i = 1; i < 26; i++){ 
     for(int j = 0; j < cyphertext.length(); j++){ 
      char currentChar = cyphertext.charAt(j); 
      int newCharIndex = a2z.indexOf(currentChar)+i; 
      plaintext[j] = a2z.get(newCharIndex); 
     } 
    } 
} 

回答

0

您不需要循環列表來處理邊緣情況。此外,您應該記住,字符A-Z的ascii值介於65-90和a-z之間97-122。您可以創建兩個圓形的名單,但不是在需要的時候,因爲邊緣的情況下很容易處理:

public static void main(String[] args) { 
    String cyphertext = "aVaqrprzoreoeratraWhyvhfraJnygreUbyynaqreqrgjrroebrefinaRqvguZnetbganneNzfgreqnzNaarjvytenntzrrxbzraznnezbrgabtrrarragvwqwrovwbznoyvwiraBznmnyurgzbrvyvwxuroorabzNaarabtrracnnejrxraqnnegrubhqrafpuevwsgRqvguSenaxvarraoevrsnnaTregehqAnhznaauhaiebrtrerohhezrvfwrvaSenaxshegnzZnva"; 
    char[] plaintext = new char[cyphertext.length()]; 

    // first shift 
    shiftLetters(cyphertext, plaintext, 1); 
    // update cyphertext with the intermediate result 
    cyphertext = new String(plaintext); 
    // second shift 
    shiftLetters(cyphertext, plaintext, 2); 
    // print result 
    System.out.println(new String(plaintext)); 

} 

private static void shiftLetters(String cyphertext, char[] plaintext, int shifts) { 
    for (int i=0; i<cyphertext.length(); i++){ 
     int tmp = cyphertext.charAt(i) + shifts; 
     tmp = handleEdgeCases(tmp); 
     plaintext[i] = (char)(tmp); 
    } 
} 

// here we handle the "circular" cases 
private static int handleEdgeCases(int tmp) { 
    if (tmp > 90 && tmp < 97) { 
     tmp = tmp - 90 + 65; 
    } else if (tmp > 122) { 
     tmp = tmp - 122 + 97; 
    } 
    return tmp; 
} 
+0

但是,如果您將資本V轉移了12次,那麼它的價值會從86轉移到98,然後程序認爲它是小寫b。 – Nils

+0

插件/編輯:(使用循環時)但其餘的工作。 – Nils

+0

另一個小小的增加,我認爲-90 + 65導致-25應該是-26。否則:一個ascii值爲122,用1移動的'z'變爲123.然後在邊緣方法中,減去25得到98,即'b'。但它需要成爲'a'。 – Nils

0

的問題是在這裏:

int newCharIndex = a2z.indexOf(currentChar)+i; 
plaintext[j] = a2z.get(newCharIndex); 

這裏的解碼字符0 25之間和ASCII的AZ去從65到90你要移到該指數在a2z的範圍從A到Z:

plaintext[j] = a2z.get(newCharIndex) + 'A'; 
+0

我不知道,如果是這種情況,因爲的indexOf(A)應該返回0 ,那麼+我把它作爲例子1,然後得到(1)應該返回一個B作爲一個新的字符,它的作用。問題是當v移到z之外。 – Nils

1

如果我理解你的權利,你想要的替代密碼,以用N升檔字母,從包裝0到A,做大寫和小寫字母,並保持所有其他字符不變。

E.g.如果N是2:

a → c b → d ... x → z y → a z → b 
A → C B → D ... X → Z Y → A Z → B 

是這樣的?

char[] text = "aVaqrprzoreoeratraWhyvhfraJnygreUbyynaqreqrgjrroebrefinaRqvguZnetbganneNzfgreqnzNaarjvytenntzrrxbzraznnezbrgabtrrarragvwqwrovwbznoyvwiraBznmnyurgzbrvyvwxuroorabzNaarabtrracnnejrxraqnnegrubhqrafpuevwsgRqvguSenaxvarraoevrsnnaTregehqAnhznaauhaiebrtrerohhezrvfwrvaSenaxshegnzZnva".toCharArray(); 
for (int n = 1; n < 26; n++) { 
    for (int i = 0; i < text.length; i++) { 
     char c = text[i]; 
     if (c >= 'A' && c <= 'Z') 
      text[i] = (char)('A' + (c - 'A' + n) % 26); 
     else if (c >= 'a' && c <= 'z') 
      text[i] = (char)('a' + (c - 'a' + n) % 26); 
    } 
} 
System.out.println(new String(text)); 

輸出

nIndecemberbrengenJuliusenWalterHollanderdetweebroersvanEdithMargotnaarAmsterdamAnnewilgraagmeekomenmaarmoetnogeeneentijdjebijomablijvenOmazalhetmoeilijkhebbenomAnnenogeenpaarwekendaartehoudenschrijftEdithFrankineenbriefaanGertrudNaumannhunvroegerebuurmeisjeinFrankfurtamMain 

當然,你認識到,通過1移位,然後通過2,然後通過3,...並最終通過26,是相同的如同移動一次(1 + 2 + 3 + ... + 26),即351和351 % 26 = 13

而由13移位意味着編碼和解碼是相同的操作。


說明

如果通過26移位,你移位恰好一個完整的圓,即a → a b → b ...,以免移這是相同的,因此,任何的N換擋> = 26是與N%26相同,例如N = 28N = 2相同。

移位由1 a → b然後通過2 b → d然後通過3 d → g,是與由1 + 2 + 3 = 6 a → g移位。因此,移動1 + 2 + ... + 26 = 351與移位351%相同26 = 13.

如果變量c是大寫字母(AZ),那麼c - 'A'是0和25.添加一個6的例子,你得到一個數字6-31。 26(% 26)做其餘爲您提供了6-25,0-5然後+ 'A'給你G-Z,A-F,這意味着A → G B → H ... Y → E Z → F,每個信6.

同爲小寫字母移位。

+0

我想我會想移動1,然後按2等來打印所有的中間結果。所以要檢查實際輸出的結果是否合理。我真的不明白爲什麼移位(351)26的總和等於所使用的移位量。 – Nils

+0

我也沒有真正獲得if if語句中的部分。 – Nils

相關問題