C++ C++;谜团::解码消息

C++ C++;谜团::解码消息,c++,C++,嘿,所有的im都在一个程序上工作,这个程序提供了将消息(字符串)转换为3种不同方案的选项:素移位编码方案、移位编码方案和反向编码方案。我已经知道了如何编码和解码素数移位方案和反转方案,但是我在移位编码方案上遇到了一点麻烦。移位方案的规则如下:消息中的每个字符都转换为其ASCII值。该值从1000中减去,得到三组数字。然后,三元组中的每个数字都会转换为键盘上数字1–0上方的符号值。符号字符串是经过编码的消息 例如,如果角色的值为37,则从1000中减去该值,得到963的三元组。相应的键盘字符为(^

嘿,所有的im都在一个程序上工作,这个程序提供了将消息(字符串)转换为3种不同方案的选项:素移位编码方案、移位编码方案和反向编码方案。我已经知道了如何编码和解码素数移位方案和反转方案,但是我在移位编码方案上遇到了一点麻烦。移位方案的规则如下:消息中的每个字符都转换为其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)
    {
    }
}
ShiftyEnigma::ShiftyEnigma()
{
键盘[0]=')';
键盘[1]=“!”;
键盘[2]=“@”;
键盘[3]=“#”;
键盘[4]=“$”;
键盘[5]=“%”;
键盘[6]='^';
键盘[7]='&';
键盘[8]=“*”;
键盘[9]='(';
}
void ShiftyEnigma::encode()
{
细流ss;
流s1;
int值=0;
for(无符号整数i=0;iss我们首先创建符号的反向查找。我使用0表示无效数字,因为数组默认初始化为0,使用10标记数字0。
您循环输入的每个字符,并在反键盘数组上使用反向查找查看它映射到的数字。如果反向查找返回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*/ }
}  
int反键盘[256]={0};
反键盘['!']=1;
反键盘['@']=2;
反键盘['#']=3;
反键盘['$']=4;
反键盘['%']=5;
反键盘['^']=6;
反键盘['&']=7;
反键盘['*']=8;
反键盘['(']=9;
反键盘[')']=10;//注意这是0,但我把它设为10
整数位数=0,数字,数字=0;
for(无符号整数i=0;i如果(数字>=1&&digit)对标准库组件的使用有任何限制(特别是使用
std::map
)你不需要,它只会让代码更有趣。一个查找表同样足够。不,没有限制。
std::map
做什么?它不需要,所以不用担心。如果你好奇的话,可以查看它。同时,请看下面。你能解释一下吗?@Lefteris EThank你这么多!@Lefteris E