Как следует из названия поста, я работаю над тем, чтобы лучше понять C ++ и манипулирование персонажами, на этот раз путем создания Vigenere Cipher. Для тех, кто не знаком с ним, это довольно простой способ зашифровать текстовый файл.
Основной способ, которым он работает, состоит в том, что существует строка «ключ», и каждый символ (по крайней мере, в моем случае) представляет собой строчный алфавитный символ. Они хранятся в массиве и используются для «сдвига» значения кодируемого файла. Символ «a» сместит цель на 0, а «z» сместит ее на 25. «Сдвиг» является циклическим, что означает, что если «z» смещается на «b» (1), это должно привести к «а».
Мой текущий метод найден ниже:
//Assume cipher[] contains "[a][b][c][x ][y ][z ]" Cipher is a <string> object
//Assume ptr[] contains "[0][1][2][23][24][25]
#A whole bunch of includes
char c;
ifstream is;
ofstream os;
is.open(argv[3]) //"myinput.txt"os.open(argv[4]) //"myoutput.txt"
int i = 0;
while( is.good() ) {
c = is.get();
if( is.good() ) { //did we just hit the EoF?
c = tolower( c - 0 ); //just make sure it's lowercase
c = c + ptr[ i % cipher.size() ] % 26;
if( c> 122 )
c = ( c % 123 ) + 97;
i++;
os.put( c );
}
}
Я считаю, что моя проблема заключается в моих операциях по модулю. Может быть, это потому, что я потратил так много времени на хеширование, но вчера я потратил много часов на написание этого, а затем еще час лежал в постели, пытаясь понять, как эффективно создавать то, что я хочу:
grab char.
check char. //let char = 'z'
check the cipher. //let the cipher = 'y'
eval cipher shift //'y' shift value = 24
shift z 24 places (cyclically) //'z'==25, 25+24=49, 49%26=23. 23='x'
ЗДЕСЬ ВОПРОС: Как это сделать с ACSII? («а» = 97, z = «121»)
Представьте, что вы хотите «перемешать» цифры «0-9» между 20 и 29 двумя шагами, так что 20 становится 22, а 29 становится 21. Как бы Вы это сделали?
Что ж, я бы вычел 20 [наше базовое число], а затем перетасовал оставшуюся цифру, а затем снова добавил 20.
newnum = num — 20;
newnum% = 10;
newnum + = 20;
Тот же принцип будет применяться для ASCII — просто это, конечно, база не 20.
Других решений пока нет …