请问大家,关于如何从TMEMORYSTREAM流中读出数据做累加计算.(100分)

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

cjsam

Unregistered / Unconfirmed
GUEST, unregistred user!
我有个
var
ms:TmemoryStream,
现在我想定义一个longint型的变量,为了确认传送这个流的正确型,做校验用,我需要把这个流里的内容,每4个字节累加起来,得到一个值,这个值的大小也是4个字节,溢出的就丢了,反正只要整个流里的4字节累加和的后4个字节大小.
大体的代码这样个样子,具体的有很多问题,请大家帮我看看,谢谢.
var
t:TMemorystream;
i:integer;
tt,ttt:Longint;
begin
t:=TMemoryStream.Create;
t.LoadFromFile('c:/111.bin');
t.Position:=0;
ttt:=0;
for i:=0 to (t.size div 4) do
begin
t.Seek(i*4,sofrombeginning);

t.Readbuffer(tt,4);//这样读出来不对,到底怎样读,请帮我看看.

ttt:=ttt+tt;
end;
 
t.Readbuffer(tt,4);//这样读出来不对,到底怎样读,请帮我看看.
这样读出来并不是整数吧?
如果你的文件是整数,你这样读试试。
var
fp:file of Longint;
i:integer;
tt,ttt:Longint;
begin
assignfile(FP,'c:/111.bin');
reset(fp);
ttt:=0;
repeat
read(fp,tt);
ttt:=ttt+tt
until eof(fp);

代码没有测试,大概意思是这样,你可以自己试试。
 
var
t:TMemorystream;
i:integer;
tt: ^LongInt;
ttt:Longint;
begin
t:=TMemoryStream.Create;
t.LoadFromFile('c:/111.bin');
t.Position:=0;
ttt:=0;

GetMem(tt, 4);

for i:=0 to (t.size div 4) do
begin
t.Seek(i*4,sofrombeginning);

t.Read(tt^,4);

ttt:=ttt+tt^;
end;
FreeMem(tt);
 
zywcd,谢谢你回答,
文件是个2进制的文件,我是将文件读到一个临时的内存流里,需要形成一个新的文件,这个新的文件里包括累加和,还包括原文件的里的一些内容裁减,并且我已经包这个流的SIZE长度给补成4的整数长度,在后面补了0xFF,所以,我的操作是在流里操做,并没有文件操作,我写的例子只是提出来写的,最好成绩需要的是将在一个内存流的一个新构成2进制文件做累加.并不时对一个新的文件做累加,知道怎样做吗?
 
在读的地方再做个异常处理, 防溢出.
 
iceapi
谢谢,我一会儿再试下,出差在外,上网不方便,在网吧里,一会儿回宾馆试了可以再接贴,不然,怕还要在这问.
 
我觉得你读出来的不应该这样直接加。
读出来需要进行处理才是longint.
 
不客气的:-/
 
zywcd:
读出来的应该是16进制的内容,如果直接加也可以吧.反正我只是做的校验,肯定会溢出,不只4个字节,我只要后4个字节的.你觉得应该怎样做呢.
 
比如这样的:假如内容为p,
P=1234567890ABCDEF87654321 (共12个字节,P的长度应该为4的倍数,不足补0xff)
则S=0x12345678+0x90ABCDEF+0x87654321 =0x2A456788 (不管溢出,长度始终为4字节)
 
你测试了读出来的longint的值是对的吗?
 
zywcd
还没有呢,我还没回去,网吧到宾馆有距离,去了只有明天来了,想晚点走,你觉得,照上面做怎样?
 
其他没有问题,我担心你直接这样取出来的数据不是你要的。是4个字节的char ,不是一个longini
 
如果是CHAR,可以转换成16进制的值,在看看呢.
 
是。其他我觉得没有问题。你都已经做了。就这一点需要测试和注意。
 
谢谢,真是好久没用过DELPHI了,临时被拉过来做一个小项目,有问题找你请教呀.晚上回去就改.
 
祝你好运。
 
我发现了个问题,读没问题,好象存放顺序有问题。呵呵,我另开一贴有空看看吧
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3561974
 
多人接受答案了。
 
后退
顶部