谁能帮我解释一下这些代码,恕小生Delphi学的不精,总看的一知半解.(50分)

  • 主题发起人 主题发起人 Great
  • 开始时间 开始时间
G

Great

Unregistered / Unconfirmed
GUEST, unregistred user!
//密钥生成移位表(循环左移)
ShiftTable : array [1..16] of Byte = (1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1);

type
Array28 = array [1..28] of byte;

procedure Shift(var SubKeyPart)
-------->问题?
var
SKP: Array28 absolute SubKeyPart
--------》问题?
n, b: byte;
begin
//把SKP循环左移1次
b := SKP[1];
for n:=1 to 27 do
SKP[n] := SKP[n+1];
SKP[28] := b;
end;

//生成子密钥
procedure SubKey(Round: Byte
var C, D: Array28
var SubKey);
var
SK: array [1..48] of byte absolute SubKey;
n, b: Byte;
begin
//C, D分别循环左移,移动次数取决于密钥生成移位表(ShiftTable)的内容
for n := 1 to ShiftTable[Round] do
begin
Shift(C);
Shift(D);
end;

//利用置换距阵2,生成子密钥
for n := 1 to 48 do
begin
b := PC_2[n];
if b <= 28 then SK[n] := C else SK[n] := D[b-28];
end;
end;
 
absolute 指的是内存中的绝对地址,只在dos下的turbo pascal 下才能用,
delphi里不能用,因为在32位系统下,只能寻址虚拟地址,不能寻址绝对地址。
 
不但是Win95, Win3也是使用虚似内存技术的。
 
技巧1:
这种变量称为无类型变参
常见于内存直接读写、流读写等情况下,
因为往往只关心内存地址,而不关心具体的类型,

使用时必须先进行强制类型转换,如Integer(xxx):=123456
好处是这种变参可以匹配任何类型的实参,
你可以看看TStream的Read,Write方法

技巧2:
absolute表示声明的变量与指定变量占用相同的内存地址
这个程序中写的意思是
SKP(Array28类型)使用与SubKeyPart相同的地址,
SKP就相当于Array28(SubKeyPart)
这也是一种技巧,可以省略大量的强制转换语句,
而且使用SKP变量也比使用Array28(SubKeyPart)的感觉好得多
另外,如果absolute后面跟的不是变量,而是<B>具体的地址</B>(实际上是一回事),
那么就<B>将SKP定义到这个固定的地址了</B>,很有意思吧
下面是Delphi Help关于absolute:
<B>To declare a variable that resides at a specified memory address,
put the word absolute after the type name, followed by an address.</B>
本质上是指定变量地址



总的来说技巧1还是比较常见的,技巧2就没什么大的意义,
知道就行了。
 
在Windows 中可以用absolute,但只能是变量名而不能是地址。
 
诸位的高论的确让我茅塞顿开,这段代码摘自一个DES算法的控件.

但我先不急着给分,想听听还有没有别人的高论.

不过,蚯蚓的40分我是给定了.

^_^
 
多人接受答案了。
 
后退
顶部