100分,不会都入来看一下,UP都有分! 如何将一个DCU文件的里面几个字节更改?即是我知道的十六进制代码为:AA 78 DD BB CC我想将它改为:AA 65 DD 12 CC.请给代码! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一定要用delpi写代码吗?好像很多软件都可以做到这点啊! 这还不简单,用TFileStream打开,用Seek定位到那个修改的字节,读出,修改,再写入。就完了。代码就不知怎么写了。 帮你写吧:procedure EditFile(FileName: string; DestBuffer, EditBuffer: Pointer; Count: Integer);var Step, RetVal, FileSize: Integer; Buffer: Pointer; Stream: TFileStream;begin Stream := TFileStream.Create(FileName, fmOpenReadWrite); try GetMem(Buffer, Count); try Step := 0; Stream.Position := Step; FileSize := Stream.Size - Count; while Step <= FileSize do begin Stream.ReadBuffer(Buffer^, Count); if CompareMem(Pointer(Buffer), DestBuffer, Count) = 0 then begin Stream.Position := Step; Stream.WriteBuffer(EditBuffer^, Count); break; end; Inc(Step); Stream.Position := Step; end; finally Free; end; finally Stream.Free; end;end;procedure ButtonClick;var Dest, Edit: array [0..5] of Byte;begin Dest[0] := $DA; Dest[1] := $AB; ... Edit[0] := $dd; Edit[1] := $AA; EditFile('c:\a.dcu', Dest, Edit);end;大概是这样吧,没调试。 那个: try finally FreeMem(Buffer); //不是Free end; 我随手打的,所以随处也能看到问题。 while Step <= FileSize do改 while Step > FileSize do不看了,再看又看到错的我也又要回,自已改吧 这个Count的值应该是多少呢? 就是: sizeof(dest),就是array [0..5] of Char = 6 啊,你自已定义的嘛while Step <= FileSize do那while没有错,我现在头晕了,不清楚了 还有CompareMem返回的是Boolean, 不是Integer,再改.睡觉啦.:) 我改了,但一运行就出错!不知错在哪里呢?function TForm1.EditFile(FileName: string; DestBuffer, EditBuffer: Pointer; Count: Integer):Boolean;var Step, RetVal, FileSize: Integer; Buffer: Pointer; Stream: TFileStream;begin Stream := TFileStream.Create(FileName, fmOpenReadWrite); result := False; try GetMem(Buffer, Count); try Step := 0; Stream.Position := Step; FileSize := Stream.Size - Count; while Step <= FileSize do begin Stream.ReadBuffer(Buffer^, Count); if CompareMem(Pointer(Buffer), DestBuffer, Count) then begin Stream.Position := Step; Stream.WriteBuffer(EditBuffer^, Count); break; Result := True; end; Inc(Step); Stream.Position := Step; Result := False; end; finally FreeMem(Buffer); end; finally Stream.Free; end;end;procedure TForm1.Button1Click(Sender: TObject);var Dest, Edit: array [0..3] of Char; Path :String;begin Path := ExtractFilePath(Application.ExeName); Dest[0] := #$75; Dest[1] := #$18; Dest[2] := #$6A; Dest[3] := #$EF; // ... Edit[0] := #$EB; Edit[1] := #$18; Edit[2] := #$6A; Edit[3] := #$EF; if EditFile(Path+'a.dcu', Pointer(Dest), Pointer(Edit),Sizeof(Dest)) then ShowMessage('Good');end; 基本思路:procedure EditFile(FileName: string; DestBuffer, EditBuffer: Pointer; Count: Integer);var Step, RetVal, FileSize: Integer; Buffer: Pointer; Stream: TFileStream;begin Stream := TFileStream.Create(FileName, fmOpenReadWrite); try GetMem(Buffer, Count); try Step := 0; Stream.Position := Step; FileSize := Stream.Size - Count; while Step <= FileSize do begin Stream.ReadBuffer(Buffer^, Count); if CompareMem(Pointer(Buffer), DestBuffer, Count) = 0 then begin Stream.Position := Step; Stream.WriteBuffer(EditBuffer^, Count); break; end; Inc(Step); Stream.Position := Step; end; finally Free; end; finally Stream.Free; end;end;procedure ButtonClick;var Dest, Edit: array [0..5] of Byte;begin Dest[0] := $DA; Dest[1] := $AB; ... Edit[0] := $dd; Edit[1] := $AA; EditFile('c:\a.dcu', Dest, Edit);end; 不会吧,还出错,我调试过了,你用UltraEdit打开DCU文件,随便找个字节来修改,最好明显点,如修改成上下行一样,容易比较。function EditFile(FileName: string; DestBuffer, EditBuffer: Pointer; Count: Integer): Boolean;var Step, FileSize: Integer; Buffer: Pointer; Stream: TFileStream;begin Result := False; Stream := TFileStream.Create(FileName, fmOpenReadWrite); try GetMem(Buffer, Count); try Step := 0; Stream.Position := Step; FileSize := Stream.Size - Count; while Step <= FileSize do begin Stream.ReadBuffer(Buffer^, Count); if CompareMem(Pointer(Buffer), DestBuffer, Count) then begin Stream.Position := Step; Stream.WriteBuffer(EditBuffer^, Count); Result := True; break; end; Inc(Step); Stream.Position := Step; end; finally FreeMem(Buffer); end; finally Stream.Free; end;end;procedure TForm1.Button1Click(Sender: TObject);var Dest, Edit: array[0..3] of Byte;begin Dest[0] := $3C; Dest[1] := $70; Dest[2] := $0B; Dest[3] := $53; // ... Edit[0] := $32; Edit[1] := $2D; Edit[2] := $00; Edit[3] := $72; if EditFile('c:\temp\a.dcu', @Dest[0], @Edit[0], Sizeof(Dest)) then ShowMessage('Good') else ShowMessage(':(((');end;这是文件流方式,如果文件不大,可以用TMemoryStream,比较速度会快点,用它的Memory指针,也不用ReadBuffer,直接CompareMem(Pointer(Integer(Memory) + Step), DestBuffer, Count),做循环就得了,代码嘛就自已写了。 在线等,新手学delphi,谢谢大家 为什么动态创建的LABLE在界面上没有显示? 200分求助!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 急!询问! 为什么公网 IP 的机器无法正常使用 TIdTcpServer? 在线给分!关于ACTIVEFORM?UP5分! quickreport中如何确定打印是否已经准备好? DBE数据库发布经验谈。大家聊聊吧! 关于frame的用法请教! 徘徊在Delphi和C++Builder的诱惑中 关于clientDataSet和ADODataSet的区别 为什么没反应???
好像很多软件都可以做到这点啊!
procedure EditFile(FileName: string; DestBuffer,
EditBuffer: Pointer; Count: Integer);
var
Step, RetVal, FileSize: Integer;
Buffer: Pointer;
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenReadWrite);
try
GetMem(Buffer, Count);
try
Step := 0;
Stream.Position := Step;
FileSize := Stream.Size - Count;
while Step <= FileSize do
begin
Stream.ReadBuffer(Buffer^, Count);
if CompareMem(Pointer(Buffer), DestBuffer, Count) = 0 then
begin
Stream.Position := Step;
Stream.WriteBuffer(EditBuffer^, Count);
break;
end;
Inc(Step);
Stream.Position := Step;
end;
finally
Free;
end;
finally
Stream.Free;
end;
end;procedure ButtonClick;
var
Dest, Edit: array [0..5] of Byte;
begin
Dest[0] := $DA;
Dest[1] := $AB;
...
Edit[0] := $dd;
Edit[1] := $AA;
EditFile('c:\a.dcu', Dest, Edit);
end;大概是这样吧,没调试。
try finally
FreeMem(Buffer);
//不是Free
end;
while Step <= FileSize do
改
while Step > FileSize do不看了,再看又看到错的我也又要回,自已改吧
你自已定义的嘛while Step <= FileSize do那while没有错,我现在头晕了,不清楚了
EditBuffer: Pointer; Count: Integer):Boolean;
var
Step, RetVal, FileSize: Integer;
Buffer: Pointer;
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenReadWrite);
result := False;
try
GetMem(Buffer, Count);
try
Step := 0;
Stream.Position := Step;
FileSize := Stream.Size - Count;
while Step <= FileSize do
begin
Stream.ReadBuffer(Buffer^, Count);
if CompareMem(Pointer(Buffer), DestBuffer, Count) then
begin
Stream.Position := Step;
Stream.WriteBuffer(EditBuffer^, Count);
break;
Result := True;
end;
Inc(Step);
Stream.Position := Step;
Result := False;
end;
finally
FreeMem(Buffer);
end;
finally
Stream.Free; end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Dest, Edit: array [0..3] of Char;
Path :String;
begin
Path := ExtractFilePath(Application.ExeName);
Dest[0] := #$75;
Dest[1] := #$18;
Dest[2] := #$6A;
Dest[3] := #$EF;
// ...
Edit[0] := #$EB;
Edit[1] := #$18;
Edit[2] := #$6A;
Edit[3] := #$EF;
if EditFile(Path+'a.dcu', Pointer(Dest), Pointer(Edit),Sizeof(Dest)) then
ShowMessage('Good');end;
procedure EditFile(FileName: string; DestBuffer,
EditBuffer: Pointer; Count: Integer);
var
Step, RetVal, FileSize: Integer;
Buffer: Pointer;
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenReadWrite);
try
GetMem(Buffer, Count);
try
Step := 0;
Stream.Position := Step;
FileSize := Stream.Size - Count;
while Step <= FileSize do
begin
Stream.ReadBuffer(Buffer^, Count);
if CompareMem(Pointer(Buffer), DestBuffer, Count) = 0 then
begin
Stream.Position := Step;
Stream.WriteBuffer(EditBuffer^, Count);
break;
end;
Inc(Step);
Stream.Position := Step;
end;
finally
Free;
end;
finally
Stream.Free;
end;
end;procedure ButtonClick;
var
Dest, Edit: array [0..5] of Byte;
begin
Dest[0] := $DA;
Dest[1] := $AB;
...
Edit[0] := $dd;
Edit[1] := $AA;
EditFile('c:\a.dcu', Dest, Edit);
end;
EditBuffer: Pointer; Count: Integer): Boolean;
var
Step, FileSize: Integer;
Buffer: Pointer;
Stream: TFileStream;
begin
Result := False;
Stream := TFileStream.Create(FileName, fmOpenReadWrite);
try
GetMem(Buffer, Count);
try
Step := 0;
Stream.Position := Step;
FileSize := Stream.Size - Count;
while Step <= FileSize do
begin
Stream.ReadBuffer(Buffer^, Count);
if CompareMem(Pointer(Buffer), DestBuffer, Count) then
begin
Stream.Position := Step;
Stream.WriteBuffer(EditBuffer^, Count);
Result := True;
break;
end;
Inc(Step);
Stream.Position := Step;
end;
finally
FreeMem(Buffer);
end;
finally
Stream.Free;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
Dest, Edit: array[0..3] of Byte;
begin
Dest[0] := $3C;
Dest[1] := $70;
Dest[2] := $0B;
Dest[3] := $53;
// ...
Edit[0] := $32;
Edit[1] := $2D;
Edit[2] := $00;
Edit[3] := $72;
if EditFile('c:\temp\a.dcu', @Dest[0], @Edit[0], Sizeof(Dest)) then
ShowMessage('Good')
else
ShowMessage(':(((');
end;这是文件流方式,如果文件不大,可以用TMemoryStream,比较速度会快点,用它的Memory指针,也不用ReadBuffer,直接CompareMem(Pointer(Integer(Memory) + Step), DestBuffer, Count),做循环就得了,代码嘛就自已写了。