Caesar的密码是最简单的加密算法。它将固定值添加到文本的每个字符的ASCII(unicode)值。换句话说,它移动字符。解密文本只是将文本移回相同的数量,也就是说,它从字符中减去了相同的值。
我的任务是编写一个函数:
~
的所有可见ASCII字符(ASCII码从32到126)。如果移位后的代码不在此范围内,则应回绕。例如,如果我们将~
移1
,则结果应该是空格。如果我们将空间移动-1
,则结果应为~
。这是我的MATLAB代码:
function [coded] = caesar(input_text, shift)
x = double(input_text); %converts char symbols to double format
for ii = 1:length(x) %go through each element
if (x(ii) + shift > 126) & (mod(x(ii) + shift, 127) < 32)
x(ii) = mod(x(ii) + shift, 127) + 32; %if the symbol + shift > 126, I make it 32
elseif (x(ii) + shift > 126) & (mod(x(ii) + shift, 127) >= 32)
x(ii) = mod(x(ii) + shift, 127);
elseif (x(ii) + shift < 32) & (126 + (x(ii) + shift - 32 + 1) >= 32)
x(ii) = 126 + (x(ii) + shift - 32 + 1);
elseif (x(ii) + shift < 32) & (126 + (x(ii) + shift - 32 + 1) < 32)
x(ii) = abs(x(ii) - 32 + shift - 32);
else x(ii) = x(ii) + shift;
end
end
coded = char(x); % converts double format back to char
end
我似乎无法正确进行换行转换(例如,从31转换为126,从30转换为125,从127转换为32,依此类推)。我应该如何更改代码来做到这一点?
答案 0 :(得分:2)
在甚至开始编写类似代码之前,您应该对如何解决该问题有一个把握。
您遇到的主要障碍是如何将模运算应用于数据,看看如何mod
将输入“包装”到[0 modPeriod-1]
的范围,而您自己的数据在{{ 1}}。为了使[32 126]
在这种情况下有用,我们执行一个中间步骤,即将输入转移到mod
“喜欢”的范围,即从某些mod
到[minVal maxVal]
。
因此,我们需要找到两件事:所需班次的大小和[0 modPeriod-1]
的周期的大小。第一个很简单,因为它只是mod
,它是第一个字符的ASCII值(为空格)的负数(在MATLAB中写为-minVal
)。对于' '
的周期,这只是您的“字母”的大小,恰好是“移位后比最大值大1”或换句话说-mod
。本质上,我们正在做的是以下
maxVal-minVal+1
现在看一下如何使用MATLAB的矢量化表示法编写该代码:
input -> shift to 0-based ("mod") domain -> apply mod() -> shift back -> output
以下是一些测试:
function [coded] = caesar(input_text, shift)
FIRST_PRINTABLE = ' ';
LAST_PRINTABLE = '~';
N_PRINTABLE_CHARS = LAST_PRINTABLE - FIRST_PRINTABLE + 1;
coded = char(mod(input_text - FIRST_PRINTABLE + shift, N_PRINTABLE_CHARS) + FIRST_PRINTABLE);
答案 1 :(得分:0)
我们可以使用周期函数的思想来解决它: 周期函数在每个周期重复一次,每个周期等于2π ...
像周期函数一样,我们有一个函数,每95个值重复一次
周期= 126-32 + 1; 我们添加一个是因为'32'也在循环中...
因此,如果字符的值超过'126',我们减去95,
即如果值= 127(大于126 ),则等于 127-95 = 32。
&如果该值小于32,则减去95。
即如果值= 31(小于32 ),则等于31 + 95 = 126 ..
现在,我们将其翻译为代码:
function out= caesar(string,shift)
value=string+shift;
for i=1:length(value)
while value(i)<32
value(i)=value(i)+95;
end
while value(i)>126
value(i)=value(i)-95;
end
end
out=char(value);
答案 2 :(得分:0)
首先,我将输出(shift + text_input)转换为char。
function coded= caesar(text_input,shift)
coded=char(text_input+shift);
for i=1:length(coded)
while coded(i)<32
coded(i)=coded(i)+95;
end
while coded(i)>126
coded(i)=coded(i)-95;
end
end