Delphi-读取文本文件中的十六进制值并将其放入长单词中

Delphi-读取文本文件中的十六进制值并将其放入长单词中,delphi,hex,readfile,Delphi,Hex,Readfile,我的项目需要一点帮助。我有一个名为Script.txt的文本文件,其中包括: 0000FCA2:FA2C 0000BC8D:F21C 0000FCA2:FA2C 0000BC8D:F21C 我需要把“$0000FCA2”放在一个名为“地址”的长单词里。并将“$FA2C”放在一个名为“HexValue”的长单词中。在第二行,我也必须这样做。”$0000BC8D’在另一个名为“Address2”的长单词中,与第一个一样,我必须在“HexValue2”长单词中添加“$F21C”。我怎么做 对不起,我上

我的项目需要一点帮助。我有一个名为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)