2016-10-20 17 views
1

私は32から暗号化のASCIIの範囲を制限する方法を知りたい - 私たちは、CHARおよび暗号化/個々の文字を解読するために文字列を変換することになっている私たちの任務のために126シーザー暗号化と復号化C++

を。

私は現在、暗号化

int value = (value-32+shift)%95+32 //value is the current ascii value of a     
            //character 
            //the first shift is given by the user with regards 
            //to how many shifts he wants to do to the right 

のためにこれを使用していますし、この復号化のための

int value = (value-32-shift)%95+32 

私の暗号化は、完全に(私は復号化機能を引用する際に)取り組んでいるが、私の復号化は機能していませんそれがどうなるか。

余分ノート:我々は唯一のエンコーディングは、単一の文字列を暗号化および復号化するために私たちのプログラム全体のために与えられたときに右シフトを行う必要があります(「これはC++である」)

Give shift: 3 
Wklv#lv#F.. 
DECODE 
Wklv#lv#F.. //must be 'THIS is C++' 
ENCODE  //shift=15 
This is C++ //must be 'cwx#/x#/R::' 
DECODE 
EYZdpZdp4{{ //must be 'THIS is C++' 
ENCODE  //shift=66 
cwx#/x#/R:: //must be "8LMWbMWb'mm" 
DECODE 
This is C++ 
ENCODE  //shift=94 
cwx#/x#/R:: //must be 'SGHR~hr~B**' 
DECODE 
This is C++ 

注:のプロセスでコードの説明を追加する

+0

を私たちは、[MCVE]が必要です。そこには "Minimal"がありますのでご注意ください。我々は*固定シフト、あなたが期待する出力、およびあなたが得る出力を見たいだけです。 –

答えて

2

問題はModulo operator with negative valuesで説明されています。私はこれが正確な重複であるとは思わない。問題は、 '!'のような暗号文字をデコードすることです。 1つ以上のシフト(「3」と言う)を持つ。

int value = (value-32-shift)%95+32 
      = ('!'-32-3)%95+32 
      = (33-32-3)%95+32 
      = (-2)%95 + 32 
      = -2 + 32 
      = 30 

int value = (value-32+(95-shift))%95+32 
2

probelmが(value-32-shift)がマイナスになることができるということである:あなたが使用する必要があります。モジュロ演算は「ラップアラウンド」しませんが、実際にはゼロ付近で「ミラーリング」します(理由を知りたい場合はthis question and answerを参照してください)。 剰余演算を実行する前に95を追加し、あなたの値が正とどまることを確実にするために:

int value = (value-32-shift+95)%95+32