AW: Datei auf Indikatoren für Binärdatei testen?
So, jetzt habe ich auch die UTF-16-Prüfung eingebaut:
Delphi-Quellcode:
Wer jetzt noch eine Datei in freier Wildbahn findet, die von dieser Funktion falsch erkannt wird, der kriegt ein Stück vom übriggebliebenen Muttertagskuchen! ;-)
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; |
AW: Datei auf Indikatoren für Binärdatei testen?
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).
|
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
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! |
AW: Datei auf Indikatoren für Binärdatei testen?
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 ...
|
AW: Datei auf Indikatoren für Binärdatei testen?
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.
|
AW: Datei auf Indikatoren für Binärdatei testen?
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.) |
AW: Datei auf Indikatoren für Binärdatei testen?
Danke. Ja, eine Prüfung auf MagicBytes könnte ich noch einbauen.
|
AW: Datei auf Indikatoren für Binärdatei testen?
Das wäre meiner Meinung nach das sinnvollste, wobei Du nicht aus den Augen verlieren darfst wofür es gut sein soll.
Zitat:
Gruß K-H |
AW: Datei auf Indikatoren für Binärdatei testen?
Liste der Anhänge anzeigen (Anzahl: 1)
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. |
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 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