向大家请教这个加密算法
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’为参数为例具体跟我讲讲问号处的意思,小弟实在想不明白。谢啦 

解决方案 »

  1.   

    1) 把鼠标移动到setlength上然后按F1你会得到最全面的答复
    2) 把字符串buffer首字符地址付给P--看来是为之后做指针移位用
    3) 对一个字符进行加密,把它先转为PWORD类型,然后加上34567
    但是这个过程可以简化,String本来就是指针
    V := WORD(Buffer[i])+34567
    应该就可以了
      

  2.   

    谢谢楼上的指教,我还有几点不明白:
    1。P:=PChar(@Buffer[0])将buffer的首字符地址传递给了P,那么PWORD(P)^是怎样转换为Word型的;
    2。string[255]这样声明的字符串,是不是ShortString型?buffer[0]是不是存放着字符串的长度?
      

  3.   

    1)其实是两部分首先是指针类型的转换PWORD(P)将P转为PWORD型指针,然后取指针所指向的内存中内容赋值给V,^代表的是指针所指向的内容
    但有一点,如果我没有理解错,CHAR类型为8bit,WORD为16bit,所以每次当你做PWORD(P)^取值时取2字节,也就是说你每一次加密编码对应两个字符,而这也是为什么每次指针偏移为2 P:=P+2,而且程序中好像为了不使他越界,给字符串在之前做了一些处理
    2)是不是ShortString我还真不敢回答。但是按我的理解255字符以下的应该是ShortString
    buffer[0]是存放着字符串字符长度,真正的字符串字符是从buffer[1]开始的可能有不对的地方你再查查资料
      

  4.   

    对于V := WORD(Buffer[i])+34567,Buffer[i]是char型,怎么转化为Word型????怎么想都想不明白,请高手指点指点
      

  5.   

    谢谢yktd26这么热心帮忙,不过你这样讲解我还是不够明白,我现在拿个简单的参数‘s’带进去
    经过buffer:=buffer+buffer这步后buffer为'ssssssssssssssss'(16个)
    经过setlength(Buffer,i)这步后按F1的说法就是简单将1(i的值)赋给buffer[0]
    经过P:=PChar(@Buffer[0])这步后将指针赋给P
    就对i=1这次循环来讲V:=34567+PWORD(P)^中P所指的内容任是字符串的长度,这步如何转换如何运算??
      

  6.   

    我觉得应该这样理解
    在你的循环之前
    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,他们改变了数据,只是为了达到最终输出的结果符合我们的要求