![](/img/trans.png)
[英]I wrote a C++ program that would simulate Enigma machine.I am not getting the output
[英]C++ Enigma::Decoding A Message
大家好,我正在開發一個程序,該程序為您提供了將消息(字符串)轉換為3種不同方案的選項:素數移位編碼方案,移位編碼方案和反向編碼方案。 我已經找到了如何編碼和解碼素數移位方案和反向方案的方法,但是我對Shifty編碼方案有一點麻煩。 Shifty方案的規則如下:消息中的每個字符都將轉換為其ASCII值。 從1000中減去該值,得到三元組。 然后,將三元組的每個數字轉換為鍵盤上數字1到0上方的符號值。符號字符串是已編碼的消息。
例如,如果字符的值為37,則將其減去1000,從而得出三元組963。相應的鍵盤字符為(^#。
然后將編碼后的消息與密鑰以及與方案相對應的數字一起存儲在文本文件中。 當用戶單擊“解碼”按鈕時,將打開一個文件選擇器,並且用戶選擇了要讀入的文本文件。一旦他/她選擇了要打開的文件,程序就會讀取編碼后的消息中的密鑰和方案。 因此,程序必須能夠獲取編碼后的消息並將其轉換回其原始消息。
我已經找到了對Shifty方案進行編碼的代碼,並且可以完美地對消息進行編碼,但是我對如何對消息進行解碼一無所知。 我知道我必須以某種方式從編碼的字符串中獲取每個數字三元組,然后從每個數字中減去1000,這樣我就可以獲得正確的ascii字符,但是我在如何做到這一點上迷失了。 任何幫助,將不勝感激。
到目前為止,我有這個:
ShiftyEnigma::ShiftyEnigma()
{
keyBoard[0] = ')';
keyBoard[1] = '!';
keyBoard[2] = '@';
keyBoard[3] = '#';
keyBoard[4] = '$';
keyBoard[5] = '%';
keyBoard[6] = '^';
keyBoard[7] = '&';
keyBoard[8] = '*';
keyBoard[9] = '(';
}
void ShiftyEnigma::encode()
{
stringstream ss;
stringstream s1;
int value = 0;
for(unsigned int i = 0; i < codedMessage.length(); ++i)
{
int ascii = codedMessage.at(i);
//subtracting 1000 from ascii number of each character in message
value = 1000 - ascii;
//setting the value in string stream in order to convert each digit of
//triplet (ex 887) into values that match the keyboard array
ss << value;
for(unsigned int i = 0; i < ss.str().length(); ++i)
{
s1 << keyBoard[(int)ss.str().at(i)-48];
}
ss.str("");
}
codedMessage = s1.str();
}
void ShiftyEnigma::decode()
{
for(unsigned int i = 0; i < codedMessage.length(); ++i)
{
}
}
我們從為符號創建反向查找開始。 我將0用作無效數字,因為該數組默認情況下被初始化為0,並使用10將該數字標記為0。在輸入的每個字符上循環並在antiKeyboard數組上使用反向查找以查看其映射到的數字。 如果反向查詢返回0,那么我們發現一個無效字符。 我選擇忽略它,但是您可能會顯示一條錯誤消息。 現在我們需要獲取3個有效數字並將它們組合在一起。 將3位數字組合成3位數字,我們可以這樣做:number = digit1 * 100 + digit2 * 10 + digit。 我這樣做是循環的。
int antiKeyboard[256]= {0};
antiKeyboard['!'] = 1;
antiKeyboard['@'] = 2;
antiKeyboard['#'] = 3;
antiKeyboard['$'] = 4;
antiKeyboard['%'] = 5;
antiKeyboard['^'] = 6;
antiKeyboard['&'] = 7;
antiKeyboard['*'] = 8;
antiKeyboard['('] = 9;
antiKeyboard[')'] = 10; //Note this is 0, but i put is as 10
int digits = 0, digit, number=0;
for(unsigned int i = 0; i < codedMessage.length(); ++i)
{
digit = antiKeyboard[codedMessage.at(i)];
if (digit >=1 && digit <=10){
++digits;
number = number * 10 + (digit % 10); //note modulo 10 converts 10 back to 0.
if (digits == 3){
printf("%c",1000-number);
digits = 0;
number = 0;
}
}else{ /*Invalid character, ignoring*/ }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.