2016-10-20 4 views
1

Я хотел бы знать, как ограничить диапазон ASCII шифрования от 32 - 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]. Обратите внимание на «Минимальный». Мы хотим видеть только * фиксированный сдвиг, ожидаемый результат и полученный результат. –

ответ

2

Ваша проблема объясняется в Modulo operator with negative values. Я не уверен, что это точный дубликат. Проблема в том, что декодирование символа шифрования, такого как '!' со смещением более одного (скажем, «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) может стать отрицательным. Операция modulo не «обтекает», а фактически «зеркало» вокруг нуля (см. this question and answer, если вы хотите знать почему). Чтобы убедиться, что значение остается положительным, добавьте 95 перед выполнением операции по модулю:

int value = (value-32-shift+95)%95+32 
Смежные вопросы