Delphi-PRAXiS
Seite 5 von 5   « Erste     345   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Datei auf Indikatoren für Binärdatei testen? (https://www.delphipraxis.net/185028-datei-auf-indikatoren-fuer-binaerdatei-testen.html)

Bjoerk 11. Mai 2015 16:47

AW: Datei auf Indikatoren für Binärdatei testen?
 
Ggf. tut man sich leichter, die Datei zunächst in einen HEX String zu überführen um dann einfach mit Pos nach Hex Sequenzen zu suchen?
Delphi-Quellcode:
function GetBinToHex(Value: TStream): string;
var
  Stream: TMemoryStream;
begin
  SetLength(Result, (Value.Size - Value.Position) * 2);
  if Length(Result) > 0 then
  begin
    Stream := TMemoryStream.Create;
    try
      Stream.CopyFrom(Value, Value.Size - Value.Position);
      Stream.Position := 0;
      BinToHex(PChar(integer(Stream.Memory) + Stream.Position), PChar(Result),
        Stream.Size - Stream.Position);
    finally
      Stream.Free;
    end;
  end;
end;

function LoadFromFile(const FileName: string): string;
var
  FileStream: TFileStream;
begin
  Result := '';
  if FileExists(FileName) then
  begin
    FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    try
      FileStream.Position := 0;
      Result := GetBinToHex(FileStream);
    finally
      FileStream.Free;
    end;
  end;
end;

Dejan Vu 11. Mai 2015 21:13

AW: Datei auf Indikatoren für Binärdatei testen?
 
Wir basteln uns eine Binärdatei (eindeutig keine Textdatei, da $FFFE kein Unicode-Zeichen ist):
Delphi-Quellcode:
Type
  TData = Packed Record
    SpielerNummer,
    HighScore,
    LevelCode,
    TaschenInhalt : Byte;
  end;

const
  data :TData = (SpielerNummer:255;
                 HighScore:254;
                 LevelCode:255;
                 TaschenInhalt:254
                );

Var
  dataFile : File Of TData;

begin
  AssignFile(dataFile,'c:\Spielstand.Dat');
  Rewrite(dataFile);
  Write(dataFile,data);
  CloseFile(dataFile);
end;
Was macht dein Code? Ich habe es nicht ausprobiert, aber er dürfte meinen, das es sich um eine Textdatei handelt, da Du ja nicht prüfst, ob es eine Textdatei ist, sondern nur, ob es so einigermaßen danach aussieht. Na ja. Wenn es Dir reicht..

PeterPanino 11. Mai 2015 23:07

AW: Datei auf Indikatoren für Binärdatei testen?
 
Zitat:

Zitat von Bjoerk (Beitrag 1301090)
Ggf. tut man sich leichter, die Datei zunächst in einen HEX String zu überführen um dann einfach mit Pos nach Hex Sequenzen zu suchen?

Vielen Dank für den Hinweis, ich werde mir das ansehen.

PeterPanino 11. Mai 2015 23:28

AW: Datei auf Indikatoren für Binärdatei testen?
 
Zitat:

Zitat von Dejan Vu (Beitrag 1301133)
Wir basteln uns eine Binärdatei (eindeutig keine Textdatei, da $FFFE kein Unicode-Zeichen ist):

Natürlich ist #255#254 indirekt ein Unicode-Zeichen, nämlich ein UTF-16 BOM. (Hättest du meinen Code gelesen, dann hättest du es gesehen). Wenn du die Datei in einem beliebigen Unicode-Text-Editor lädst, hält er das wegen des BOM für eine Unicode-Datei und stellt deswegen natürlich den Rest nicht mehr dar, weil - wie du richtig sagst - das kein Unicode-Zeichen ist.

Häng noch ein paar ASCII-Zeichen dran, und Notepad interpretiert das chinesisch ...

Du siehst also, dass sogar weit verbreitete Text-Editoren das für einen Text halten (wegen des BOM) - insofern befinde ich mich in guter Gesellschaft. Und streng definitionsgemäß ist es (wegen des BOM) ja eine Unicode-Textdatei, nur eben eine verkorkste Unicode-Textdatei.

Nur DU hältst es für eine Binärdatei, weil sie von deinem Spiel als strukturierte Datendatei gespeichert wurde. Das wissen aber andere Programme nicht. Für die ist es eine Unicode-Textdatei mit einem BOM. Wäre der Spielstand 254:254:255:254 gewesen, würde jeder moderne Text-Editor die Datei als ganz normalen Text darstellen, weil der BOM dann fehlt, denn es IST ja definitionsgemäß eine Textdatei.

Für Unicode-Text-Editoren ist das eben die durch den BOM bedingte Rest-Unsicherheit, die ich in mehreren Postings genannt habe, und die sich nicht vermeiden lässt - für den Rest ist es eine ganz normale Textdatei.

PS:
Zitat:

Zitat von Dejan Vu (Beitrag 1301133)
da Du ja nicht prüfst, ob es eine Textdatei ist, sondern nur, ob es so einigermaßen danach aussieht.

Auch das ist nicht richtig: Meine Funktion prüft NICHT "ob es so einigermaßen [nach einer Textdatei] aussieht", sondern sie prüft, ob Indikatoren für eine Binärdatei enthalten sind. Steht auch ganz deutlich im Titel dieses Themas.

Dejan Vu 12. Mai 2015 06:52

AW: Datei auf Indikatoren für Binärdatei testen?
 
He he. Richtig. Nur ist $FFFE ein ungültiges Unicode-Zeichen. Hätte ich schreiben müssen. Kommt aufs gleiche heraus. Ich schreibe eine Binärdatei und deine Routine meint, es wäre eine Textdatei. Und richtig: ICH schreibe eine Binärdatei und dann ist es eine.

Zitat:

Zitat von PeterPanino (Beitrag 1301143)
Häng noch ein paar ASCII-Zeichen dran, und Notepad interpretiert das chinesisch ...

Hab ich aber nicht. Meine Datei besteht aus 4 Bytes und ist eine Binärdatei. Richtig? Richtig. Und vollkommen egal (wegen des Threadtitels).
Zitat:

Du siehst also, dass sogar weit verbreitete Text-Editoren das für einen Text halten (wegen des BOM) - insofern befinde ich mich in guter Gesellschaft.
Na ja: "Fresst Scheiße, 100.000.000 Mio Fliegen können nicht irren" fällt mir dabei ein.

Aber offenbar klingelt es bei mir. Man muss den Titel wirklich wörtlich nehmen. Alles ok.

Wieso man dafür aber so viele Posts verbraten muss, verstehe ich mittlerweile auch nicht (obwohl ich ja Teil des Spams bin ;-) ).

Schön aufs Glatteis gelaufen... :thumb:

PeterPanino 12. Mai 2015 10:33

AW: Datei auf Indikatoren für Binärdatei testen?
 
Zitat:

Zitat von Dejan Vu (Beitrag 1301147)
Ich schreibe eine Binärdatei und deine Routine meint, es wäre eine Textdatei. Und richtig: ICH schreibe eine Binärdatei und dann ist es eine.

Jede Textdatei ist eine Binärdatei. Und wenn du eine "Binärdatei speicherst", dann kann das wiederum durchaus eine Textdatei sein (oder was immer du als Textdatei bezeichnest); denn andere Programme wissen ja nicht, wie du die Datei erzeugt hast.

Ein anschauliches Beispiel: Stell dir vor, du bist ein Bäcker. Eines Tages raubt jemand eine Bank aus und kauft am nächsten Tag bei dir mit dem geraubten Geld ein Brötchen. Hast du dich damit strafbar gemacht? Antwort: Nein, denn du konntest ja nicht wissen, dass das Geld für das Brötchen aus einem Bankraub stammt. Siehst du, das Geld ist die Datei, dessen Herkunft du ja nicht kennst. Für dich ist lediglich wichtig und entscheidend, was auf dem Geldschein drauf steht - bzw. was in der Datei drin steht. Wenn der Geldschein echt ist, kann man damit Brötchen kaufen, ganz unabhängig davon, wo der Geldschein her stammt. So ist das.

Dejan Vu 12. Mai 2015 12:49

AW: Datei auf Indikatoren für Binärdatei testen?
 
Man Panino. Eine Binärdatei ist es deshalb, weil ich Zahlen reinschreibe, keinen Text. Basta.

Wenn ich Dadaist bin, der gerade seine grenzdebile Surealismusphase auslebt, und ein Buch schreibe, ist das ein Buch mit Inhalt. Punkt.

Alle anderen würden es als Kauderwelsch eines SchwachkopfesKünstlers bezeichnen, aber es ist nun einmal ein Buch. Mit Inhalt. Das ist sozusagen die Intention des Erstellers/Autors/Künstlers.

Vermutlich kauft irgend ein Walddröpfel das Teil sogar für viel Geld.

So, aber Du willst halt mit Haarspalterei, Pfennigpfuchserei und Erbsenzähler-ei Recht haben. Haste. Kriegste geschenkt.

So, ich geh wieder in den Sandkasten, wo ich ja hingehöre. :stupid:

Daniel 12. Mai 2015 18:02

AW: Datei auf Indikatoren für Binärdatei testen?
 
Seid so gut und führt Euren Wettbewerb im "sich gegenseitig ans Bein pinkeln" per PN fort. Das interessiert wirklich keinen Außenstehenden.

Dejan Vu 13. Mai 2015 06:45

AW: Datei auf Indikatoren für Binärdatei testen?
 
6 Stunden später. Das Ding war doch längst gegessen. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 Uhr.
Seite 5 von 5   « Erste     345   

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