请教一个加密算法问题
向大家请教这个加密算法
function jiami(s:string):string
type PWORD=^WORD;
var Len:integer;
i:integer;
v:DWORD;
P:PChar;
buffer:string[255];
begin
buffer:=s;
Len:=Length(buffer)+1;
if (Len mod 2)<>0 then inc(Len);
if (Len<10) then Len:=10;
i:=Length(Buffer);
if i=0 then
buffer:=inttostr(GetTickCount)
esle
while length(buffer)<10 do
buffer:=buffer+buffer;
setlength(Buffer,i);?????
Result:='';
P:=PChar(@Buffer[0]);???????
for i:=1 to len div 2 do
begin
V:=34567+PWORD(P)^;??????
P:=P+2;
Result:=Result+Format('%5.5d',[V]);
end;
end;
请各位高手以‘s’为参数为例具体跟我讲讲问号处的意思,小弟实在想不明白。。。。谢啦
[解决办法]
我觉得应该这样理解
在你的循环之前
P:=PChar(@Buffer[0])是把字符串Buffer的首字节地址传给P,这个首字节地址中存放的内容对于buffer来说确实是他的长度,但是对于你之后的加密编码来说他只不过是简单的存放在内存中的256bit的数据,你的加密运算也没有对他进行特别的处理,你可以当他和其他的字符数据一样
一个Char类型和Byte类型其实一样,他指明了一段256bit的空间,所谓Char或者Byte按我的理解(也许有其他差异)只是在我们之后读取的时候是以什么形式读取,比如说$20,如果他是byte类型,你之后读取转换为integer就是32,如果他是char类型,你之后读取就是一个空格,但是在内存中存放的数据只是00100000,可以说是系统解码方式的不同,就像buffer[0]他对于string来说确实存放着他的长度,但是在内存里的也只是一个256bit的数据,所以你之后读取他并进行运算,他已经失去了对于string的意义,而只是一段数据
WORD(Buffer[i])属于强制类型改变,他的目的是不改变数据内容而只是改变数据读取的方式,也就是所谓的解码方式,比如说这个字符还是个空格那么Buffer[i]这段内存中放的是00100000,现在我们做强制类型转换,只是将1byte按2byte读出,即是0000000000100000,但是他的值并没有改变,只是我们的读取方式不同了,它不同于一些类型转换函数比如说StrToInt,他们改变了数据,只是为了达到最终输出的结果符合我们的要求