gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:12:33 25 4
gpt4 key购买 nike

要将文件内容加载为十六进制,我在 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;

这显示了像这样的十六进制加载文件:

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是否可能,或者我需要一些特殊的组件来实现此目的?

谢谢

最佳答案

不存在“编写十六进制”这样的事情。十六进制只是表示数字并更轻松地执行一些数学运算的一种方式。十六进制值 $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;

关于Delphi如何替换Hex文件中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25308394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com