德尔福在文件中更改十六进制地址

时间:2016-03-17 10:35:27

标签: delphi

我想通过delphi更改十六进制地址15个字符,

enter image description here

我这样跟着这样,但我没有成功,

BlockRead(F,arrChar,1);                  //read all to the buf
CloseFile(F);                            //close file
IMEI:=Form1.Edit1.Text;                  //get the number
Form1.Memo1.Lines.Add('new IMEI is'+IMEI);    //output 

for i:=524288 to 524288+15 do               /
  arrChar[i]:=IMEI[i-524287];

1 个答案:

答案 0 :(得分:2)

使用文件流执行此操作。

var
  Stream: TFileStream;
....
Stream := TFileStream.Create(FileName, fmOpenWrite);
try
  Stream.Position := $080000;
  Stream.WriteBuffer(IMEI, SizeOf(IMEI));
finally
  Stream.Free;
end;

我假设IMEI是长度为15的固定长度字节数组,但是您的代码尝试写入16个字节,因此看起来您会遇到一定程度的混淆。

在您的代码中,您的变量IMEI是一个字符串。这不是一个字节数组。请不要将字符串视为字节数组的经典错误。

您可以声明这样的IMEI类型:

type
  TIMEI = array [0..14] of Byte;

然后你可以编写一个函数来填充文本中的这个变量:

function TextToIMEI(const Text: string): TIMEI;
var
  ResultIndex, TextIndex: Integer;
  C: Char;
begin
  if Length(Text) <> Length(Result) then
    raise SomeExceptionClass.Create(...);

  TextIndex := low(Text);
  for ResultIndex := low(Result) to high(Result) do 
  begin
    C := Result[TextIndex];
    if (C < '0') or (C > '9') then
      raise SomeExceptionClass.Create(...);
    Result[ResultIndex] := ord(C);
    inc(TextIndex);
  end;
end;

然后,您可以将此代码与上述代码结合使用:

procedure WriteIMEItoFile(const FileName: string; FileOffset: Int64; const IMEI: TIMEI);
var
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenWrite);
  try
    Stream.Position := FileOffset;
    Stream.WriteBuffer(IMEI, SizeOf(IMEI));
  finally
    Stream.Free;
  end;
end;

这样称呼:

WriteIMEItoFile(FileName, $080000, TextToIMEI(Form1.Edit1.Text));

虽然您明确使用Form1全局变量看起来有点奇怪。如果该代码在TForm1方法中执行,那么您应该使用隐式Self变量。