你从下面(而不是dll)调用StreamFreqTestBlock看看是否有溢出:
procedure StreamFreqTestBlock(StreamBuf: PChar; StreamLen: Integer; OneCount: PInteger);
var
I, n1,n,buf_order: Integer;
StreamByte,TempByte: Byte;
label TestEnd;
begin
n1 := 0;
n := 0;
buf_order := 0;
while True do
begin
StreamByte := Ord(StreamBuf[buf_order]);
Inc(buf_order);
for I := 0 to 7 do
begin
TempByte := StreamByte and 128;
if TempByte <> 0 then Inc(n1);
StreamByte := StreamByte shl 1;
Inc(n);
if n = StreamLen then goto TestEnd;
end;
end;
TestEnd:
OneCount^ := n1;
end;
var
tempstream:Tfilestream;
ta,tb,streamlen,i,j:integer;
streambuff:array of char;
pbuff:Pchar;
tempbuff:Pchar;
tempfilename:string;
onecount:integer;
begin
tempfilename:='d:\crypttext';
tempstream:=Tfilestream.Create(tempfilename,fmopenread);
streamlen:=tempstream.Size*8;
setlength(streambuff,(streamlen div 8)+1);
tempstream.Position :=0;
tempstream.Read(streambuff[0],streamlen div 8);
tempstream.Destroy ;
ta:=128
for i:=1 to 50 do
begin
edit1.Text:=inttostr(i);
edit1.Refresh;
tb:=streamlen div ta;
for j:=0 to tb-1 do
begin
tempbuff:=nil;
tempbuff:=@streambuff[j*(ta div 8)];
StreamFreqTestBlock(tempbuff,ta,@onecount);
end;
end;
end;
其中StreamFreqTestBlock()是我调用的别人的vc dll中的一个函数
函数原型
void StreamFreqTestBlock(char *StreamBuf,int StreamLen,int *OneCount)
{int n1,n,buf_order;
char StreamByte,TempByte;
int i;
n1=n=buf_order=0;
do
{StreamByte=StreamBuf[buf_order];
buf_order++;
for (i=0;i<8;i++)
{TempByte=StreamByte&128;
if (TempByte)
n1++;
StreamByte<<=1;
n++;
if (n==StreamLen) goto testend;
}
setlength(blockdata,strtoint(hzxpslen_edit.text)+1);//一般128
pblockdata:=@blockdata[0];
for j:=0 to strtoint(hzxpslen_edit.text) do
blockdata[j]:=0;
for j:=0 to ta-1 do////ta 为3000多
begin
tempbuff:=@streambuff[j*(strtoint(hzxpslen_edit.Text )div 8)];
StreamFreqTestBlockVertical(tempbuff,strtoint(hzxpslen_edit.text) ,pblockdata);
end;
end;
其中keytime超过22时溢出。