如何忽略 Vigenere 密码中的空格?
How to ignore spaces in Vigenere cipher code?
我有两个功能:
function EnCryptSymbolVij(text, key:char; abc:string):char;
var st: string;
positionText: word;
begin
if text=' ' then begin EnCryptSymbolVij:=' '; exit; end;
PositionText:=pos(text,abc);
if positionText=0 then exit;
st:=MoveVij(length(abc)-pos(Key,abc)+1, abc);
EnCryptSymbolVij:=st[positionText];
end;
function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
begin
st[i]:=EnCryptSymbolVij(text[i], Key[j], abc);
inc(j);
if j>length(key) then j:=1;
end;
EnCryptVij:=st;
End;
在第一个函数中,我添加了space支持。但是当我用 spaces 加密文本时,我得到了错误的加密,因为第二个函数将 spaces 计算为 alphavit 的一部分。我该如何解决这个问题并忽略第二个函数中的加密 spaces?请帮忙解决这个问题。
您只支持字母字符和 spaces。如果你想做更多,你需要在代码中更聪明一些。空格未加密,并且 space 没有加密,因此您只需要在解密中添加该测试即可。如果您稍后支持其他非字母字符,您也需要对这些字符执行相同的操作,但加密和解密的测试是相同的。所以对于 spaces,你的符号解密代码将像你的加密一样开始,就像这样
function DeCryptSymbolVij(text, key:char; abc:string):char;
var st: string;
positionText: word;
begin
if text=' ' then begin DeCryptSymbolVij:=' '; exit; end;
我个人更喜欢使用 'Result' 而不是函数名称,但这只是个人喜好。
编辑
为了满足第二个函数中的 spaces,您可以在 inc(j) 周围加上 spaces 的测试,就像这样
function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
begin
st[i]:=EnCryptSymbolVij(text[i], Key[j], abc);
if st[ I ] <> ' ' then
begin
inc(j);
end;
if j>length(key) then j:=1;
end;
EnCryptVij:=st;
End;
但对于 'future proof',您最好向第一个函数添加一个 Var 布尔参数,并在发生替换时设置它:
function EnCryptSymbolVij(text, key:char; abc:string; var changed : boolean):char;
var st: string;
positionText: word;
begin
changed := FALSE;
PositionText:=pos(text,abc);
if positionText=0 then exit;
// else
changed := TRUE;
st:=MoveVij(length(abc)-pos(Key,abc)+1, abc);
EnCryptSymbolVij:=st[positionText];
end;
function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
iChanged : Boolean;
st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
begin
st[i]:=EnCryptSymbolVij(text[i], Key[j], abc, iChanged);
if iChanged then
begin
inc(j);
end;
if j>length(key) then j:=1;
end;
EnCryptVij:=st;
End;
注意第一个函数不需要space测试(假设'abc'中没有space)
我有两个功能:
function EnCryptSymbolVij(text, key:char; abc:string):char;
var st: string;
positionText: word;
begin
if text=' ' then begin EnCryptSymbolVij:=' '; exit; end;
PositionText:=pos(text,abc);
if positionText=0 then exit;
st:=MoveVij(length(abc)-pos(Key,abc)+1, abc);
EnCryptSymbolVij:=st[positionText];
end;
function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
begin
st[i]:=EnCryptSymbolVij(text[i], Key[j], abc);
inc(j);
if j>length(key) then j:=1;
end;
EnCryptVij:=st;
End;
在第一个函数中,我添加了space支持。但是当我用 spaces 加密文本时,我得到了错误的加密,因为第二个函数将 spaces 计算为 alphavit 的一部分。我该如何解决这个问题并忽略第二个函数中的加密 spaces?请帮忙解决这个问题。
您只支持字母字符和 spaces。如果你想做更多,你需要在代码中更聪明一些。空格未加密,并且 space 没有加密,因此您只需要在解密中添加该测试即可。如果您稍后支持其他非字母字符,您也需要对这些字符执行相同的操作,但加密和解密的测试是相同的。所以对于 spaces,你的符号解密代码将像你的加密一样开始,就像这样
function DeCryptSymbolVij(text, key:char; abc:string):char;
var st: string;
positionText: word;
begin
if text=' ' then begin DeCryptSymbolVij:=' '; exit; end;
我个人更喜欢使用 'Result' 而不是函数名称,但这只是个人喜好。
编辑
为了满足第二个函数中的 spaces,您可以在 inc(j) 周围加上 spaces 的测试,就像这样
function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
begin
st[i]:=EnCryptSymbolVij(text[i], Key[j], abc);
if st[ I ] <> ' ' then
begin
inc(j);
end;
if j>length(key) then j:=1;
end;
EnCryptVij:=st;
End;
但对于 'future proof',您最好向第一个函数添加一个 Var 布尔参数,并在发生替换时设置它:
function EnCryptSymbolVij(text, key:char; abc:string; var changed : boolean):char;
var st: string;
positionText: word;
begin
changed := FALSE;
PositionText:=pos(text,abc);
if positionText=0 then exit;
// else
changed := TRUE;
st:=MoveVij(length(abc)-pos(Key,abc)+1, abc);
EnCryptSymbolVij:=st[positionText];
end;
function EnCryptVij(text, key, abc:string):string;
var i, n, j: longword;
iChanged : Boolean;
st:string;
begin
setlength(st,length(text));
j:=1;
for i:=1 to length(text) do
begin
st[i]:=EnCryptSymbolVij(text[i], Key[j], abc, iChanged);
if iChanged then
begin
inc(j);
end;
if j>length(key) then j:=1;
end;
EnCryptVij:=st;
End;
注意第一个函数不需要space测试(假设'abc'中没有space)