2015-03-29 2 views
1

В принципе, расшифровка (Vigenere) отлично работает, за исключением того, что не включает окончательную букву для расшифровки. Например, дешифрование для m_text дает 48 букв вместо 49. Я даже пытался манипулировать циклом, но он не работает хорошо, так как я получаю исключение вне диапазона с .at(). Любая помощь будет оценена!Loop не обрабатывает последний символ строки

using namespace std; 
#include <string> 
#include <iostream> 


int main() 

{ 
    string ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

    string m_text = "ZOWDLTRTNENMGONMPAPXVUXADRIXUBJMWEWYDSYXUSYKRNLXU"; 

    int length = m_text.length(); 

    string key = "DA"; 

    string plainText = ""; 

    int shift = 0; 

    int shift2 = 0; 



//Loop that decrypts 
for (int k = 0; k < length-1; k+=2) 
    { 
     //Key 1 shift 
     shift = m_text.at(k) - key.at(0); 
     //Key 2 shift 
     shift2 = m_text.at(k+1) - key.at(1); 

     if (shift >= 0) 
     { 
      plainText += ALPHABET.at(shift); 
     } 
     else 
     { 
      shift += 91; 
      plainText += (char)shift; 
     } 

     if (shift2 >= 0) 
     { 
      plainText += ALPHABET.at(shift2); 
     } 
     else 
     { 
      shift2 += 91; 
      plainText += (char)shift2; 
     } 
    } 
cout << plainText << endl; 
} 

ответ

0

По внешнему виду вы декодируете по два символа за раз. Поэтому, когда у вас есть 49 символов в вашей строке, есть один оставшийся (который не обрабатывается). Если вы сделаете m_text 48 символов, вы заметите, что получите правильный результат.

Возможно, было бы проще воспроизвести ваш ключ в соответствии с длиной сообщения, а затем выполнить декодирование по одному символу.

Смежные вопросы