Delphi如何替换Hex文件中的数据

时间:2014-08-14 12:45:46

标签: delphi hex delphi-7 edit

将文件内容加载为十六进制我在Delphi 7中使用此代码:

procedure ReadFileAsHex(const AFileName: string; ADestination: TStrings);
var fs: TFileStream;
    buff: Byte;
    linecount: Byte;
    line: string;
begin
  linecount := 0;
  line := '';
  fs := TFileStream.Create(AFileName, fmOpenRead);
  try
    while fs.Position < fs.Size do begin
      fs.Read(buff, 1);
      line := line + IntToHex(buff, 2) + ' ';
      Inc(linecount);
      if linecount = 16 then begin
        ADestination.Add(line);
        line := '';
        linecount := 0;
      end;
    end;
    if Length(line) <> 0 then
      ADestination.Add(line);  
  finally
    fs.Free;
  end;
end;

这显示我在Hex中的加载文件:

34 01 00 00 13 00 00 00 13 00 00 00 04 00 00 00
01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
34 01 00 00 13 00 00 00 13 00 00 00 04 00 00 00
01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00

我想从实际文件

替换部分数据

例如 我想将数据从偏移(00000060)替换为偏移(00000070),例如00 all 是否可能或者我需要一些特殊的组件呢?

由于

1 个答案:

答案 0 :(得分:4)

没有&#34;写十六进制&#34;。十六进制只是一种表示数字并更容易执行某些数学运算的方法。十六进制值$00与十进制0完全相同,如果以数字形式写入文件,则它们完全相同。如果你写$FF和十进制255,情况也是如此。它们以相同的值结束在文件中,以相同的方式编写。

换句话说,将以下任一变量写入文件将产生完全相同的文件内容:

const
  DecimalZero = 0;
  HexZero = $0;

对于这些也可以这样说:

const
  DecimalTwoFiftyFive = 255;
  HexTwoFiftyFive = $FF;

您可以告诉您实际读取数字(非文本)值,因为您发布的代码必须在值上使用IntToHex才能将其转换为十六进制字符串在它可以将其添加到line变量之前,该变量被声明为string

您正在讨论将二进制(非文本)写入文件,这只是意味着将实际数值写入文件而不是这些数字的文本表示。

您只需将TFileStream定位到您要开始编写的位置,然后将所需的字节数写入文件。您必须以写入模式打开流,而不是像代码使用fmOpenRead那样只读取。

var
  fs: TFileStream;
  Buff: array of byte;
begin

  // Set length of buffer and initialize buffer to zeros
  SetLength(Buff, 10);
  FillChar(Buff[0], Length(Buff), #0);

  fs := TFileStream.Create(AFileName, fmOpenWrite);
  try
    fs.Position := 60;                 // Set to starting point of write
    fs.Write(Buff[0], Length(Buff));   // Write bytes to file
  finally
    fs.Free;
  end;
end;