Delphi-读取文本文件中的十六进制值并将其放入长单词中
我的项目需要一点帮助。我有一个名为Script.txt的文本文件,其中包括: 0000FCA2:FA2C 0000BC8D:F21C 0000FCA2:FA2C 0000BC8D:F21C 我需要把“$0000FCA2”放在一个名为“地址”的长单词里。并将“$FA2C”放在一个名为“HexValue”的长单词中。在第二行,我也必须这样做。”$0000BC8D’在另一个名为“Address2”的长单词中,与第一个一样,我必须在“HexValue2”长单词中添加“$F21C”。我怎么做 对不起,我上周刚开始学习德尔福,所以我有很多疑问。我在谷歌上搜索我的问题,但没有找到一个好的答案。对不起,我的句子错了,英语不是我的第一语言Delphi-读取文本文件中的十六进制值并将其放入长单词中,delphi,hex,readfile,Delphi,Hex,Readfile,我的项目需要一点帮助。我有一个名为Script.txt的文本文件,其中包括: 0000FCA2:FA2C 0000BC8D:F21C 0000FCA2:FA2C 0000BC8D:F21C 我需要把“$0000FCA2”放在一个名为“地址”的长单词里。并将“$FA2C”放在一个名为“HexValue”的长单词中。在第二行,我也必须这样做。”$0000BC8D’在另一个名为“Address2”的长单词中,与第一个一样,我必须在“HexValue2”长单词中添加“$F21C”。我怎么做 对不起,我上
非常感谢 您可以创建自己的lass来读取和解析文件:
uses
System.Generics.Collections;
Type
TDataLine = class
private
FHexValue: LongWord;
FAddress2: LongWord;
public
constructor Create(const aLine: String);
property HexValue: LongWord read FHexValue;
property Address2: LongWord read FAddress2;
end;
TDataFile = class(TObjectList<TDataLine>)
public
constructor Create; reintroduce;
procedure LoadFromFile(const aFlieName: String);
end;
{ TDataLine }
constructor TDataLine.Create(const aLine: String);
var
Buffer: TArray<string>;
Tmp: Int64;
begin
Buffer := aLine.Split([':'], TStringSplitOptions.ExcludeEmpty);
if TryStrToInt64('$' + Buffer[0], Tmp) then
FHexValue := Tmp;
if TryStrToInt64('$' + Buffer[1], Tmp) then
FAddress2 := Tmp;
end;
{ TDataFile }
constructor TDataFile.Create;
begin
inherited Create(True);
end;
procedure TDataFile.LoadFromFile(const aFlieName: String);
var
DataLine: TDataLine;
Buffer: TStringlist;
sLine: String;
begin
Buffer := TStringlist.Create;
try
Buffer.LoadFromFile(aFlieName);
for sLine in Buffer do
Add(TDataLine.Create(sLine));
finally
FreeAndNil(Buffer);
end;
end;
您可以创建自己的lass来读取和解析文件:
uses
System.Generics.Collections;
Type
TDataLine = class
private
FHexValue: LongWord;
FAddress2: LongWord;
public
constructor Create(const aLine: String);
property HexValue: LongWord read FHexValue;
property Address2: LongWord read FAddress2;
end;
TDataFile = class(TObjectList<TDataLine>)
public
constructor Create; reintroduce;
procedure LoadFromFile(const aFlieName: String);
end;
{ TDataLine }
constructor TDataLine.Create(const aLine: String);
var
Buffer: TArray<string>;
Tmp: Int64;
begin
Buffer := aLine.Split([':'], TStringSplitOptions.ExcludeEmpty);
if TryStrToInt64('$' + Buffer[0], Tmp) then
FHexValue := Tmp;
if TryStrToInt64('$' + Buffer[1], Tmp) then
FAddress2 := Tmp;
end;
{ TDataFile }
constructor TDataFile.Create;
begin
inherited Create(True);
end;
procedure TDataFile.LoadFromFile(const aFlieName: String);
var
DataLine: TDataLine;
Buffer: TStringlist;
sLine: String;
begin
Buffer := TStringlist.Create;
try
Buffer.LoadFromFile(aFlieName);
for sLine in Buffer do
Add(TDataLine.Create(sLine));
finally
FreeAndNil(Buffer);
end;
end;
教育目的的一个简单示例:
type
TAddress = record
Address : LongWord;
Value : LongWord;
end;
TVarAddress = array of TAddress;
var Address : TVarAddress;
procedure GetAdressesFromTextFileIntoDynArray(FileName : String; var Arr : TVarAddress);
var
F : TextFile;
s, sAddr,sVal: string;
len,p : integer;
begin
Assign(F,FileName);
try
SetLength(Arr,0); //clear the array
Reset(F); //open text file
len := 0;
while not Eof(F) do
begin
Readln(F,s); //read line from text file
p := Pos(':',s); // get position of ":"
sAddr := Copy(s,1,p - 1); //get address from string
sVal := Copy(s,p+1,Length(s) - p); //get value from string
inc(len);
SetLength(Arr,len); //increment length of array
Arr[len -1].Address := StrToInt('$' + sAddr);
Arr[len -1].Value := StrToInt('$' + sVal);
end;
finally
CloseFile(F);
end;
end;
使用以下步骤,例如:
GetAdressesFromTextFileIntoDynArray('c:\TextFile.txt', Address);
for I := 0 to Length(Address) - 1 do
begin
Memo1.Lines.Add(IntToStr(Address[i].Address));
Memo1.Lines.Add(IntToStr(Address[i].Value));
end;
教育目的的一个简单示例:
type
TAddress = record
Address : LongWord;
Value : LongWord;
end;
TVarAddress = array of TAddress;
var Address : TVarAddress;
procedure GetAdressesFromTextFileIntoDynArray(FileName : String; var Arr : TVarAddress);
var
F : TextFile;
s, sAddr,sVal: string;
len,p : integer;
begin
Assign(F,FileName);
try
SetLength(Arr,0); //clear the array
Reset(F); //open text file
len := 0;
while not Eof(F) do
begin
Readln(F,s); //read line from text file
p := Pos(':',s); // get position of ":"
sAddr := Copy(s,1,p - 1); //get address from string
sVal := Copy(s,p+1,Length(s) - p); //get value from string
inc(len);
SetLength(Arr,len); //increment length of array
Arr[len -1].Address := StrToInt('$' + sAddr);
Arr[len -1].Value := StrToInt('$' + sVal);
end;
finally
CloseFile(F);
end;
end;
使用以下步骤,例如:
GetAdressesFromTextFileIntoDynArray('c:\TextFile.txt', Address);
for I := 0 to Length(Address) - 1 do
begin
Memo1.Lines.Add(IntToStr(Address[i].Address));
Memo1.Lines.Add(IntToStr(Address[i].Value));
end;
哪个Delphi版本?您可以使用
stroint
函数来表示十六进制数,如stroint(“$ABCDEF12”)
。因此,只需将$
字符添加到字符串中,并通过stroint
对其进行转换。哪个Delphi版本?您可以使用stroint
函数进行十六进制数字表示,如stroint('$ABCDEF12')
。因此,只需将$
字符添加到字符串中,并通过stroint
将其转换。谢谢Jens,但是我如何获得两行或更多行的字符串呢?我必须把行号写在代码的某个地方?这个函数返回的是字符串还是其他类型的变量?非常感谢你。。那么您希望记录也包含行号?如果您需要两行以上的代码,只需将它们添加到textfle@VictorMelo你需要行号吗?谢谢Jens,但是我如何得到两行或更多行的字符串?我必须把行号写在代码的某个地方?这个函数返回的是字符串还是其他类型的变量?非常感谢你。。那么您希望记录也包含行号?如果您需要两行以上的代码,只需将它们添加到textfle@VictorMelo你需要行号吗?Valentine,Delphi正在提醒TAddress=record上出现错误“需要一个标识符,但发现=“没有多少关于向他展示老式方式的教育,它在很久以前就应该从语言lang中删除。@Victomorelo它可能会起作用,但它不是做事情的最佳方式。此外,忽视试图帮助的人是不礼貌的you@JensBorrisholt请不要将最简单有效的方式称为“旧时尚方式”。Modernfashion way正在使用web服务执行此类任务:o)此答案提供了解决目标任务的简单方便的方法,而无需使用泛型等含糊不清的方法。@JensBorrisholt读取1、2或4 GB大小的文本文件(例如日志文件)并不是最简单的方法。让我们停止这些讨论。问问题,我回答:o)Valentine,Delphi在TAddress=record上警告了一些错误“需要一个标识符,但发现=“没有太多关于向他展示一种老式方式的教育,这种方式在很久以前就应该从lang语言中删除。@Victomero它可能有用,但它不是做事情的最佳方式。此外,忽视试图帮助的人是不礼貌的you@JensBorrisholt请不要将最简单有效的方式称为“旧时尚方式”。Modernfashion way正在使用web服务执行此类任务:o)此答案提供了解决目标任务的简单方便的方法,而无需使用泛型等含糊不清的方法。@JensBorrisholt读取1、2或4 GB大小的文本文件(例如日志文件)并不是最简单的方法。让我们停止这些讨论。提出问题,我回答:o)