关于求文件的内容累加和值,以便校验用. ( 积分: 50 )

  • 主题发起人 主题发起人 cjsam
  • 开始时间 开始时间
C

cjsam

Unregistered / Unconfirmed
GUEST, unregistred user!
2边通讯,取一个文件的累加和做个简单的校验,每次读4个字节来累加,初始判断,不够4个字节的整除的,用0来补位.用2个字节来保存累加和.
我下面这个代码,大家帮我看看对吗?如果不对,那有问题,我和客户端的算出来的总是不一样.但是值差的又不是很大.
Function Checksum(filename:string):integer;stdcall;
var
tm:TMemoryStream;
iLen,addLen,i,iB:integer;
str1:string;
Ts:^longint;
allTS:Longint;
begin
if filename='' then
Result:=0;
tm:=TMemoryStream.Create;
str1:='';
try
tm.LoadFromFile(filename);
except
tm.Destroy;
end;
iLen:=tm.Size;
addLen:=iLen mod 4;
//将文件后补0,凑成4的整数倍.
if addLen<>0 then
begin
for i:= 0 to addLen do
str1:=str1+chr($00);
tm.Write(str1[1],addLen);
end;
iB:=tm.Size div 4;
GetMem(Ts, 4);
allTs:=0;
for i:=0 to iB-1 do
begin
tm.Seek(i*4,sofrombeginning);
try
tm.Read(Ts^,4);
except
end;
allTs:=allTs+ts^;
end;
FreeMem(Ts);
tm.Destroy;
Result:=allTs;
end;
 
高人都吃饭去了吗?谁有空帮我看看了,谢谢!
 
用2个字节来保存累加和可能会溢出,你代码中Result和AllTs 改为 Int64类型。
 
如果溢出就不要了,只要剩下的,我想知道这个算法对不对?
 
大家上班了吧?帮我看看呀
 
有人没有呀?这样简单的的一个累加我实在看不出来是不是我错了,但是就是和另一边上来的校验总不对,大家帮我看看呀
 
请人帮我看下吧
 
我自己找到问题了。
begin
tm.Seek(i*4,sofrombeginning);
try
tm.Read(Ts^,4);
except
end;
allTs:=allTs+ts^;
end;
这个里面读到Ts地址里的数据存放顺序,在DELPHI是高位在前,低位在后,所以加起来不一样。呵呵。
 
不过还是有个问题。请问大家,我发现了我的问题,怎样解决呢?
这个问题就是,比如:
begin
tm.Seek(i*4,sofrombeginning);
try
tm.Read(Ts^,4);
//这读文件里的4个字节的数据到地址ts中去,
//理论上:52 49 46 46
//实际上读进去存放起的是:46 46 49 52
//刚好全部倒过来了。
except
end;
allTs:=allTs+ts^;
end;
有没有什么最简单的方法直接读进去就是顺序读放的方式呢。我现在是手动全部倒序过来的。
function TForm1.reverhex(st: string): string;
var
tem:string;
i:integer;
begin
for i:=3 downto 0 do
tem:=tem+copy(st,i*2+1,2);
result:=tem;
end;
allTs:=allTs+reverhex(inttohex(ts^,4));

如果文件很大的,效率很低呀。

谢谢!!
 
后退
顶部