Я хотел бы знать, как ограничить диапазон шифрования 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++
Примечание: в процессе добавления более описания кода
Ваша проблема объясняется в Оператор по модулю с отрицательными значениями. Я не уверен, что это точный дубликат. Проблема в том, что расшифровывать такой символ шифрования, как ‘! со смещением более одного (скажем, «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
Проблема в том, что (value-32-shift)
может стать отрицательным. Операция по модулю не «оборачивается», а фактически «отражает» около нуля (см. этот вопрос и ответ если хочешь знать почему).
Чтобы убедиться, что ваше значение остается положительным, добавьте 95 перед выполнением операции по модулю:
int value = (value-32-shift+95)%95+32