Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konvert Integer-Textliste nach Binary (https://www.delphipraxis.net/106150-konvert-integer-textliste-nach-binary.html)

HPW 6. Jan 2008 08:47


Konvert Integer-Textliste nach Binary
 
Hallo,

Ich will eine Textdatei die eine Liste von Integern enthält die mit einem Delimiter gerennt sind nach Binary konvertieren.
Mein Code dafür bislang:

Delphi-Quellcode:
   IF FileExists(inFile) THEN
    BEGIN
      TempList := TStringList.Create;
      TRY
           TempList.LoadFromFile(inFile);
           TempList.Text := StringReplace (TempList.Text,delimiter,chr(13)+chr(10),[rfReplaceAll, rfIgnoreCase]);
           OutStream := TMemoryStream.Create;
           TRY
             lstcount := 0;
             while (lstcount <= TempList.Count - 1) do
               begin
                 intnumber := StrToInt(TempList[lstcount]);
                 OutStream.Write(intnumber,1);
                 INC(lstcount);
               end;
             OutStream.SaveToFile(outFile);
           FINALLY
             OutStream.Free;
           END;
      FINALLY
        TempList.Free;
      END;
      Result := TRUE;
    END;
Frage: Jemand eine Idee für einen schnelleren Algorithmus?

Corpsman 6. Jan 2008 09:09

Re: Konvert Integer-Textliste nach Binary
 
ist
Delphi-Quellcode:
OutStream.Write(intnumber,1);
nicht falsch ?

das müste doch
Delphi-Quellcode:
OutStream.Write(intnumber,sizeof(integer));
heisen.

und
Delphi-Quellcode:
sizeof(integer)
ist doch gleich 4, oder ?

HPW 6. Jan 2008 12:04

Re: Konvert Integer-Textliste nach Binary
 
Das ist wohl richtig, obwohl der Code so funktioniert.
So ist es wohl richtiger.

Delphi-Quellcode:
FUNCTION IntToBinFile( inFile, outFile, delimiter : STRING) : BOOLEAN;
VAR
  TempList    : TStrings;
  OutStream   : TMemoryStream;
  lstcount    : Integer;
  intbyte     : Byte;
  ext         : STRING;
begin
 ext := ExtractFileExt(inFile);
 IF ext <> '' THEN
   BEGIN
   IF FileExists(inFile) THEN
    BEGIN
{            showmessage (inFile+outFile);}
      TempList := TStringList.Create;
      TRY
           TempList.LoadFromFile(inFile);
           TempList.Text := StringReplace (TempList.Text,delimiter,chr(13)+chr(10),[rfReplaceAll, rfIgnoreCase]);
           OutStream := TMemoryStream.Create;
           TRY
             lstcount := 0;
             while (lstcount <= TempList.Count - 1) do
               begin
                 intbyte := StrToInt(TempList[lstcount]);
                 OutStream.Write(intbyte,1);
                 INC(lstcount);
               end;
             OutStream.SaveToFile(outFile);
           FINALLY
             OutStream.Free;
           END;
      FINALLY
        TempList.Free;
      END;
      Result := TRUE;
    END;
end;
Meine Frage ging aber mehr in die Richtung Performance.
Ist eine Stringliste die schnellste Möglichkeit?

Dax 6. Jan 2008 12:11

Re: Konvert Integer-Textliste nach Binary
 
Zitat:

Zitat von HPW
Ist eine Stringliste die schnellste Möglichkeit?

Nein, die schnellste Möglichkeit dürfte ein puffergestützter Automat sein;)

HPW 8. Jan 2008 19:05

Re: Konvert Integer-Textliste nach Binary
 
Folgende Version ist wesentlich schneller als die Stringlisten-Version:

Delphi-Quellcode:
   IF FileExists(inFile) THEN
    BEGIN
      AssignFile(mfile, inFile);
      Reset(mfile);
      while not Eof(mfile) do
        begin
        Readln(mfile, mstr);
        tmpstring := tmpstring+mstr;
        end;
      CloseFile(mfile);
      OutStream := TMemoryStream.Create;
      intstr := '';
      TRY
        FOR scount := 1 to Length(tmpstring) do
         BEGIN
            if tmpstring[scount] = delimiter THEN
              BEGIN
                intbyte := StrToInt(intstr);
                OutStream.Write(intbyte,1);
                intstr := '';
              END
            ELSE
              BEGIN
                intstr := intstr+tmpstring[scount];
              END;
         END;
        intbyte := StrToInt(intstr);
        OutStream.Write(intbyte,1);
        OutStream.SaveToFile(outFile);
      FINALLY
        OutStream.Free;
      END;
      Result := TRUE;
    END;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz