我想通过delphi更改十六进制地址15个字符,
我这样跟着这样,但我没有成功,
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];
答案 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
变量。