AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Datei auf Indikatoren für Binärdatei testen?
Thema durchsuchen
Ansicht
Themen-Optionen

Datei auf Indikatoren für Binärdatei testen?

Ein Thema von PeterPanino · begonnen am 9. Mai 2015 · letzter Beitrag vom 13. Mai 2015
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#31

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

  Alt 10. Mai 2015, 17:21
So, jetzt habe ich auch die UTF-16-Prüfung eingebaut:

Delphi-Quellcode:
function IsTextFile(const AFile: string; const ABytesCount: Integer = 1000): Boolean;
// testet, ob die ersten ABytesCount Bytes einer Datei Indikatoren für eine Binär-Datei enthalten:
// wenn nicht, muss es wohl eine Textdatei sein?
// Siehe auch: http://qc.embarcadero.com/wc/qcmain.aspx?d=84071
const
  MaxAllowedForbiddenControlCharsCount = 1;
  BOM_UTF32_LSB: array [0..3] of Byte = ($FF,$FE,$00,$00);
  BOM_UTF32_MSB: array [0..3] of Byte = ($00,$00,$FE,$FF);
  BOM_UTF16_LSB: array [0..1] of Byte = ($FF,$FE);
  BOM_UTF16_MSB: array [0..1] of Byte = ($FE,$FF);
var
  Reader: TStreamReader;
  Ch: AnsiChar;
  c: Integer;
  PreviousCharWasNullByte: Boolean;
  ForbiddenControlCharsCount: Integer;

  function HasUTF32BOM(S: TStream): Boolean;
  var
    SavedPos: Int64;
    Buf: TBytes;
  begin
    SetLength(Buf, 4);
    SavedPos := S.Position;
    Result := False;
    try
      S.Seek(0, soBeginning);
      if S.Read(Buf, 4) = 4 then
      begin
        Result := ((Buf[0] = BOM_UTF32_LSB[0])
               and (Buf[1] = BOM_UTF32_LSB[1])
               and (Buf[2] = BOM_UTF32_LSB[2])
               and (Buf[3] = BOM_UTF32_LSB[3]))
               or
                  ((Buf[0] = BOM_UTF32_MSB[0])
               and (Buf[1] = BOM_UTF32_MSB[1])
               and (Buf[2] = BOM_UTF32_MSB[2])
               and (Buf[3] = BOM_UTF32_MSB[3]));
      end;
      CodeSite.Send('HasUTF32BOM', Result);
    finally
      S.Position := SavedPos;
    end;
  end;

  function HasUTF16BOM(S: TStream): Boolean;
  var
    SavedPos: Int64;
    Buf: TBytes;
  begin
    SetLength(Buf, 2);
    SavedPos := S.Position;
    Result := False;
    try
      S.Seek(0, soBeginning);
      if S.Read(Buf, 2) = 2 then
      begin
        Result := ((Buf[0] = BOM_UTF16_LSB[0])
               and (Buf[1] = BOM_UTF16_LSB[1]))
               or
                  ((Buf[0] = BOM_UTF16_MSB[0])
               and (Buf[1] = BOM_UTF16_MSB[1]));
      end;
      CodeSite.Send('HasUTF16BOM', Result);
    finally
      S.Position := SavedPos;
    end;
  end;
begin
  Result := True;
  c := 0;
  PreviousCharWasNullByte := False;
  ForbiddenControlCharsCount := 0;

  Reader := TStreamReader.Create(TFileStream.Create(AFile, fmOpenRead), TEncoding.ANSI);
  try
    if Reader.EndOfStream then
    begin
      CodeSite.Send('Nothing to read');
      Result := False;
      EXIT;
    end;

    while Reader.Peek() >= 0 do
    begin
      Ch := AnsiChar(Reader.Read());

      if Ch = #0 then
      begin
        if PreviousCharWasNullByte then
        begin
          CodeSite.Send('Double Null Byte found');
          Result := HasUTF32BOM(Reader.BaseStream); // False;
          EXIT;
        end;
        PreviousCharWasNullByte := True;
      end
      else
      begin
        PreviousCharWasNullByte := False;

        if Ch in [#1..#8, #14..#31] then
        begin
          Inc(ForbiddenControlCharsCount);
          CodeSite.Send('This forbidden control char', HexDisplayPrefix + IntToHex(Ord(Ch), 2));
        end;
        if ForbiddenControlCharsCount > MaxAllowedForbiddenControlCharsCount then
        begin
          CodeSite.Send('More than ' + IntToStr(MaxAllowedForbiddenControlCharsCount) + ' forbidden control chars found');
          Result := HasUTF16BOM(Reader.BaseStream) or HasUTF32BOM(Reader.BaseStream); // False;
          EXIT;
        end;
      end;

      // Todo: andere Indikatoren?

      Inc(c);
      if c > ABytesCount then EXIT;
    end;
  finally
    CodeSite.Send('Bytes read', c);
    Reader.Close();
    Reader.BaseStream.Free;
    Reader.Free();
  end;
end;

procedure TForm1.btnTestClick(Sender: TObject);
var
  d: Int64;
begin
  d := GetTickCount;
  CodeSite.Send('Is Text File?', IsTextFile(edt1.Text));
  CodeSite.Send('Duration', GetTickCount - d);
end;
Wer jetzt noch eine Datei in freier Wildbahn findet, die von dieser Funktion falsch erkannt wird, der kriegt ein Stück vom übriggebliebenen Muttertagskuchen!
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#32

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

  Alt 10. Mai 2015, 23:14
Da du die Frage nach der Definition einer Textdatei bzw. einer Binärdatei bislang genauso wenig beantwortet hast wie einige andere Fragen zum Problem, wird dir wohl kaum jemand eine von deinem Algorithmus nicht erfaßte Datei liefern können (wollen).
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#33

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

  Alt 11. Mai 2015, 13:33
Da du die Frage nach der Definition einer Textdatei bzw. einer Binärdatei bislang genauso wenig beantwortet hast wie einige andere Fragen zum Problem, wird dir wohl kaum jemand eine von deinem Algorithmus nicht erfaßte Datei liefern können (wollen).
Zunächst einmal ganz liebe Grüße nach Karlsruhe. Ich habe in der Vergangenheit mehrere sehr nette Menschen aus Karlsruhe getroffen, demnach muss dort ein guter Menschenschlag leben.

Ich wundere mich aber über den Inhalt deines Postings. Ich habe diese Frage (ist es überhaupt eine Frage?) in diesem Faden bereits mehrmals sehr ausführlich beantwortet und werde das deshalb hier nicht mehr tun. Im übrigen brauchst du nur meinen Code zu lesen, um zu merken, dass dieser nach dem Ausschlussprinzip funktioniert. Und mein Code funktioniert ausgezeichnet. Wenn du einen Fehler findest, bist du herzlich eingeladen, diesen aufzuzeigen. Denn dazu ist dieses Forum ja da.

Und ich bitte dich, nochmals den TITEL dieses Themas zu lesen: "Datei auf Indikatoren für Binärdatei testen?". Ich nehme mal an, dass du sinnerfassend lesen kannst.

Ich wünsche dir einen schönen Tag!
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#34

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

  Alt 11. Mai 2015, 13:55
Im Nachhinein das Eingangsposting zu editieren, um peinlich empfundener, aber nicht geäußerter Kritik an der Frageformulierung auszuweichen, ist auch nicht gerade die feine englische Art und läßt zumindest einen Mangel an Aufrichtigkeit erkennen. Damit läßt du diejenigen, die versucht haben, auf deine ursprüngliche Frage zu antworten, ziemlich dumm aussehen. Ich wette, dessen bist du dir voll bewußt. Nicht sehr erfreulich für die Forenteilnehmer, die versucht haben, dir behilflich zu sein ...
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#35

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

  Alt 11. Mai 2015, 14:02
Gehörst du irgendeiner ideologischen oder religiösen Sekte an? Offensichtlich versuchst du zu provozieren oder suchst Streit, weil du vielleicht nichts Besseres zu tun hast. Ich werde von nun an auf deine Postings nicht mehr antworten.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#36

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

  Alt 11. Mai 2015, 14:47
Nachdem ich mir mal neuere Programme angeschaut habe, das ist nicht mehr so signifikant wie es war aber trotzdem
push eax x50=P

push ebx x53=S

push esi x56=V
push edi x57=W

oder xor eax,eax x33C0

Gruß
K-H

(ich denke es ist klar, daß man damit nur die Wahrscheinlichkeit erhöhn kann. Für Sicherheit fehlt da noch einiges.)
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#37

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

  Alt 11. Mai 2015, 15:14
Danke. Ja, eine Prüfung auf MagicBytes könnte ich noch einbauen.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#38

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

  Alt 11. Mai 2015, 16:44
Das wäre meiner Meinung nach das sinnvollste, wobei Du nicht aus den Augen verlieren darfst wofür es gut sein soll.

Ich kacke mal Korinthen. Jede Datei ist eine Binärdatei, da sie letztendlich alle auf dem Datenträger nur aus Nullen und Einsen besteht. Letztendlich kommt es auf die Interpretation der Anwendung drauf an, wie die Nullen und Einsen dargestellt werden.
Dem ist kaum zu widersprechen, darum bitte immer im Hinterkopf behalten!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#39

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

  Alt 11. Mai 2015, 17:29
Der wichtigste Bestandteil bei der Entwicklung ist immer der Praxistest (dieses Forum heißt ja "Delphi-PRAXIS"). Deswegen bitte ich euch, die Funktion (s. #31) an möglichst vielen Dateien zu testen und mir positive und negative Ergebnisse zu melden, um so auch aus dem Feedback der praktischen Anwendung heraus die Funktion zu verbessern. Was ja wiederum im Interesse der Gemeinschaft der Forumsteilnehmer liegt.

EDIT: Um das Testen zu erleichtern, habe ich hier mal schnell das Testprojekt angehängt.
Angehängte Dateien
Dateityp: zip IsTextFile_Test.zip (54,4 KB, 0x aufgerufen)

Geändert von PeterPanino (11. Mai 2015 um 17:44 Uhr) Grund: Anhang
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#40

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

  Alt 11. Mai 2015, 17:43
Gehörst du irgendeiner ideologischen oder religiösen Sekte an? Offensichtlich versuchst du zu provozieren oder suchst Streit, weil du vielleicht nichts Besseres zu tun hast. Ich werde von nun an auf deine Postings nicht mehr antworten.
Das ist doch Kindergarten-Niveau, was du hier bringst: Erst weist du darauf hin, daß in meiner Stadt nur liebe Menschen leben, außer mir natürlich, nur um anschließend sofort anzudeuten, ich wäre intellektuell zu beschränkt, um überhaupt den Sinn von Texten erfassen zu können. Zuvor änderst du deinen Ursprungstext, damit einige der Fragen, die man dir zwischendurch gestellt hat, nicht mehr greifen und als blödsinnig angesehen werden müssen, und reagierst äußerst sauer, wenn man dich darauf hinweist, daß das nicht wirklich nett ist.

Nun unterstellst du mir auch noch Sektenmitgliedschaft? Sag mal, geht's noch??? Bleib doch mal auf dem Teppich. Deine vermeintliche Drohung, auf meine Postings nicht mehr einzugehen, ist doch in Wirklichkeit gar keine, denn das hast du erstens zuvor ja auch nicht gemacht, und zweitens wäre es nicht weiter schlimm, wenn du nicht antwortest. Du mußt niemandem antworten, du kannst dir aussuchen, wem du antwortest, du kannst auch überhaupt niemandem antworten, es steht dir frei.

Daß ich nachfragte, weshalb du diverse Fragen (die ja nicht nur von mir kamen) nicht beantwortest, obwohl doch zumindest die Frage danach, wie du Text- bzw. Binärdateien definierst, nicht nur berechtigt scheint, sondern für deine Problemstellung in der Tat signifikant und daher äußerst relevant ist, wirst du mir wohl kaum verübeln, oder?

Tatsache ist: Weder habe ich dich beleidgt noch dich sonst irgendwie herabzusetzen gesucht, was eine derart kindische, ja man könnte fast sagen trotzige Antwort von deiner Seite provoziert haben könnte. Bitte erkläre mir doch einmal, von mir aus auch via PM, wo ich dich deiner Ansicht nach provoziert haben soll. Ich habe mir aus meiner Sicht große Mühe gegeben, dir Informationen im Zusammenhang mit deinem Problem zu liefern. Du mußt natürlich nich darauf antworten, auch nicht auf meine Nachfragen, aber nun derart zu reagieren und dich provoziert zu fühlen, ist nun wirklich nicht angebracht. Äußere persönliche Kritik, die nichts mit dem jeweiligen Thema zu tun hat, doch bitte in Zukunft via Persönlicher Mail, denn das interessiert die anderen vermutlich eher weniger.

Nachtrag: Ich empfinde es als ein wenig unverschämt, hier die Usergemeinde dazu mißbrauchen zu wollen, Arbeit zu erledigen, die im Grunde du zu machen hast. Weshalb testest du deinen Code nicht einfach selbst? Oder glaubst du wirklich, daß die hier größtenteils werktätigen User die Zeit & Lust aufbringen, deine Programme zu testen, wo du noch nicht einmal die einfachsten Antworten zum besseren Verständnis deines Problems mitzuteilen bereit bist? Den eigentlichen Zweck deiner Anstrengungen hast du uns erst im Posting Nr. 27 verraten, das gehört aber gleich ins erste Posting, damit man als hilfsbereiter User weiß, worauf's ankommt. Von wegen mangelhafte Fähigkeit zur Texterfassung: Du solltest dir vor dem Posten überlegen, wie du eine Frage am verständlichsten rüberbringst, und nicht nachträglich das Eingangsposting verändern, um Kritik an deinen Formulierungsfähigkeiten auszuweichen. Du verweigerst zudem weitere Auskünfte und fühlst dich offenbar von entsprechenden Anfragen provoziert. Ich verstehe dein Verhalten nicht.

Geändert von Perlsau (11. Mai 2015 um 22:34 Uhr) Grund: Nachtrag
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 Uhr.
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