正如帖子标题所示,我正在努力加强对C ++和角色操控的把握,这一次是通过创建一个Vigenere Cipher。对于那些不熟悉它的人来说,加密文本文件是一种相当简单的方法。
它的基本工作方式是存在一个字符串“key”,每个字符(至少在我的例子中)是一个小写字母字符。它们存储在一个数组中,用于“移位”正在编码的文件的值。一个'a'字符会将目标移动0,而'z'会将它移动25.“shift”是循环的,这意味着如果'z'被'b'(1)移位,它应该导致'A'。
我目前的方法如下:
//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做到这一点? ('a'= 97,z ='121')
答案 0 :(得分:2)
想象一下,你想要通过两个步骤“改变”20到29之间的“1”数字0-9,使得20变为22,而29变为21。你会怎么做?
好吧,我会减去20 [我们的基数],然后将剩余的数字洗牌,然后再加20。
newnum = num - 20; newnum%= 10; newnum + = 20;
同样的原则适用于ascii - 当然基数不是20。