如何读出文件中的一段如 F1 D3 A8 00 F3 再每个字节相加。。。 (50分)

小小K

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一个二进制文件,我要改变他其中的一小段内容,如 F1 D3 A8 00 F3 ...
我是用 TMemoryStream 把文件读进来再找地址修改写回去的。
问:
1、如何用 TMemoryStream 读文件4300h处的十六进制如 F1 D3 A8 00 F3 ...到EDIT框内显示?
2、读出来的十六进制要一一相加(要求相加的和得数为字节),我要把得数写到指定的某个字节位置上。

高手请出招,分数可以加,谢谢。

以下是我写回去的代码:
procedure TfrmMain.btnWriteClick(Sender: TObject);
var
i:Integer;
S:TMemoryStream;
begin
i:=$F1FF; // i> $ffffffff 溢出....
S:=TmemoryStream.Create;
S.LoadFromFile('bbb.exe');
S.Seek($4317,soFromBeginning);//移到指定位置处
S.write(i,2);//写入该数值
S.savetoFile('bbb.exe');//保存
S.Free;
end;
 
var
i: Integer;
t: Byte;
sum: DWord;
s: TMemoryStream;
begin
s := TMemoryStream.Create;
s.LoadFromFile('bbb.exe');
s.Seek($4300, soFromBeginning); //定位
sum := 0;
for i := 1 to 6 do // 读取 6 字节
begin
s.Read(t, 1); // 读出一字节
Edit1.Text := Edit1.Text + IntToHex(t, 2) + ' '; // IntToHex 参数记不太清了
// 以上就显示一个字节
sum := sum + t; // 累加
end;
s.Free;
end;
 
差不多是这思路但是
HEXTOINT
 
多谢 天真 指正。
不过他是要显示,即把数字转化为字符串,应该是用 IntToHex 吧?
我记不太清楚了:)
 
感谢你beta,看来你对流好像挺熟悉的。再教一招。
顺便再帮我看看以下写入文件的过程,如果 i 要长一点就会溢出,
如要写入:F1 F2 F3 F4 F5 F6 F7...,(我是分开写,几个几个写,好笨。)
但我把
i:String;
i:=#$F1#$F2#$F3#$F4#$F5#$F6#$F7...
写入会变成其他码,而不是F1....?为什么?

i:String[14];
i:=#$F1#$F2#$F3#$F4#$F5#$F6#$F7
这样写入,在写的位置会多一个 14 F1 F2 F3 F4 F5 ....(14 定义字串长度也写进来,???)

procedure TfrmMain.btnWriteClick(Sender: TObject);
var
i:Integer;
S:TMemoryStream;
begin
i:=$F1FF; // i> $ffffffff 溢出....《《《(这要长一些,要怎么办?)
S:=TmemoryStream.Create;
S.LoadFromFile('bbb.exe');
S.Seek($4317,soFromBeginning);//移到指定位置处
S.write(i,2);//写入该数值
S.savetoFile('bbb.exe');//保存
S.Free;
end;
 
我觉你没讲清楚。
参照:http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1306399
如有疑问再交流。
 
顶部