Цезарь Шифрование и дешифрование Переполнение стека

Я хотел бы знать, как ограничить диапазон шифрования ASCII 32 — 126.

Для нашей задачи мы должны преобразовать строку в символ и зашифровать / расшифровать каждый отдельный символ.

Я в настоящее время использую это для шифрования

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++

Примечание: в процессе добавления более описания кода

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

Другие решения

Проблема в том, что (value-32-shift) может стать отрицательным. Операция по модулю не «оборачивается», а фактически «отражает» около нуля (см. этот вопрос и ответ если хочешь знать почему).
Чтобы убедиться, что ваше значение остается положительным, добавьте 95 перед выполнением операции по модулю:

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector