![]() |
Datei auf Indikatoren für Binärdatei testen?
Hallo!
Ich möchte testen, ob eine Datei eine "Binärdatei" oder eine "Textdatei" ist. (Ich bin mir der Problematik dieser Unterscheidung bewusst). Dazu teste ich, ob in den ersten n Bytes dieser Datei Indikatoren für eine Binärdatei enthalten sind: EDIT 10.5.2015: Besser wäre diese Formulierung: Ich möchte testen, ob eine Datei keine "Binärdatei" ist (d.h. mit möglichst hoher Wahrscheinlichkeit bei vertretbarem Aufwand ausschließen, dass es eine Binärdatei ist). Deswegen wäre ein besserer Name für die Funktion: IsNotBinaryFile. Aber das würde ggf. zu einer doppelten Verneinung im Code führen ("if not IsNotBinaryFile"), was wiederum unnötig umständlich wäre; deshalb belasse ich es bei "IsTextFile".
Delphi-Quellcode:
Welche anderen Indikatoren könnte man verwenden?
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 var Reader: TStreamReader; Ch: AnsiChar; c: Integer; begin Result := True; c := 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 CodeSite.Send('Null Byte found'); Result := False; EXIT; 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?
Es kommt darauf an, was das für dine "Text"-Datei sein soll und vorallem in welchem Format.
Bei sowas wie UFT-8 kann man prüfen, ob es ungültige UTF-8-Sequenzen enthält und wenn ja, dann ist es kein UTF-8. Von den ersten 32 "Control"-Zeichen (ASCII) werden im "Allgemeinen" nur 2 bis 3 verwendet (Tab und Zeilenumbruch) und ansonsten sollte man oftmals nichts finden. |
AW: Datei auf Indikatoren für Binärdatei testen?
Und ein Null-Byte ist kein Indikator. In UTF-16 Codiert gespeicherten Dateien wirst du sehr viele 0er Byte finden. So wäre das $-Zeichen als 00 24 in der Datei vorhanden.
Für mich wäre zwei Null-Bytes hintereinander ein Indikator. Oder das Prüfen auf die Bekannten Magic Bytes. In Wikipedia ( ![]() |
AW: Datei auf Indikatoren für Binärdatei testen?
Im Prinzip wären das 2 Ansätze:
1. Der Scan-Ansatz kann leicht in Arbeit ausarten, wenn man viele Kodierungen unterstützen will. Außerdem muss man sich genau überlegen, welche Zeichen man verbieten möchte und welche vielleicht doch im Text vorkommen können. Wenn man nur auf Nullbytes testen möchte, kann man sich den größten Teil der Arbeit bei der Dekodierung vermutlich sparen. 2. Das Testen auf die Magic-Bytes ist auf jeden Fall interessant, da es quasi nichts kostet. Man sollte aber beachten, das einige Magic-Bytes valider Text sind und auch am Anfang von Textdokumenten vorkommen könnten. |
AW: Datei auf Indikatoren für Binärdatei testen?
Ich habe die Funktion jetzt erweitert:
1. Testen auf Doppel-NullBytes anstatt auf einfache NullBytes 2. Testen auf mehr als n verbotene ControlBytes
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; var Reader: TStreamReader; Ch: AnsiChar; c: Integer; PreviousCharWasNullByte: Boolean; ForbiddenControlCharsCount: Integer; 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 := 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 := 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?
Gibt es Anzeichen für BOM? Wenn ja, versuche, die nächsten paar Bytes entsprechend zu interpretieren.
Wenn nicht, kann es a) eine Unicode-Datei ohne BOM b) eine ASCII-Datei c) eine Binärdatei sein Bei (a) ist jedes zweite Byte eine 0. Vermutlich. Bei (b) sind die Bytes=9,10,30 oder >=32 und <= 127. Meistens. Du erstellst also eine Häufigkeitstabelle der ersten paar Zeichen (N=20 z.B.) Bestehen die Bytes nur aus Zeichen, Ziffer, CR/LF? Dann handelt es sich vermutlich um eine Textdatei. Haben wir fast so viele Nullen wie sonstige Bytes und sind die Bytes auch Zeichen, Ziffer CR/LF? Dann ist es vermutlich eine Unicode-Datei Ansonsten ist die Wahrscheinlichkeit groß, das es sich um eine Binär bzw. um keine Textdatei handelt. Aber sicher kannst Du nicht immer sein. |
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
|
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
![]() Zitat:
|
AW: Datei auf Indikatoren für Binärdatei testen?
Kann man davon ausgehen, dass UTF-16- und UTF-32-Dateien statistisch signifikant so gut wie immer einen BOM enthalten?
|
AW: Datei auf Indikatoren für Binärdatei testen?
Wieso findest Du meine Heuristik denn unsicher? Wie willst du denn sonst Text-Dateien von irgendwelchen anderen Dateien unterscheiden? Genau genommen müsstest Du auch noch prüfen, ob die Datei Wörter enthält, oder zählst Du eine Base-64 Codierung auch zu Textdateien? Also, 'FXYyya678pphr'.. ist das jetzt eine Textdatei?
Und die paar Bytes an BOM können ja auch in jeder Binärdatei am Anfang stehen, ergo solltest du noch die nächsten paar Bytes analysieren. Meinst du nicht auch? |
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
![]() |
AW: Datei auf Indikatoren für Binärdatei testen?
Wie ich schon zu Anfang sagte: Ich bin mir der Problematik dieser Unterscheidung bewusst. Letztlich wird es wohl darauf hinauslaufen, für welchen speziellen Zweck man die Unterscheidung benötigt. Denn man könnte den Aufwand auf die Spitze treiben, indem man z.B. eine semantische Prüfung für alle existierenden Sprachen einbaut usw.
Könnt ihr aber die heuristische Prüfung etwas näher spezifizieren, vielleicht sogar mit etwas Code unterlegen (bezogen auf die obige Funktion). |
AW: Datei auf Indikatoren für Binärdatei testen?
Mir ist gerade ein Gedanke gekommen, wie man eine Heuristik abseits von BOM & Co. implementieren könnte: Es müsste doch möglich sein, eine Art statistischen "Streuungs"-Faktor (oder grob gesagt "statistischer Fingerabdruck") der Bytes zu berechnen, der bei "Binärdateien" signifikant von "Textdateien" abweichen sollte. Was haltet ihr davon?
|
AW: Datei auf Indikatoren für Binärdatei testen?
|
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
|
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
Zitat:
Aber deine Idee ist natürlich viel besser. Klar. ;-) |
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
Die Menge der verschiedenen Dateiformate in Verbindung mit verschiedenen Sprachen ist so zahlreich, daß mir dein Ansinnen schier unmöglich sicher zu lösen scheint. Ist eine gezippte Textdatei noch eine Textdatei? Oder eine verschlüsselte Textdatei? Ist eine RTF-Datei mit Grafiken und Ole-Objekten eine gemischte Datei? Oder eine Exe-Datei mit zahlreichen lesbaren Textabschnitten? Gehe ich richtig in der Annahme, daß du eigentlich herausfinden möchtest, ob eine Datei binär übertragen werden soll oder nicht? Was man wirklich einigermaßen sicher herausfinden kann ist, ob eine Datei einem bekannten Format entspricht, z.B. JPEG oder ASCII oder eben auch Executables oder XML etc., wie das z.B. das Programm ![]() Mir scheint es daher sinnvoll, dich auf die im Zusammenhang mit deinem Projekt auftretenden Dateiformate zu konzentrieren bzw. zu beschränken, falls das irgendwie möglich ist und nicht potentiell alle bekannten und unbekannten Dateiformate auftreten könnten. Der entsprechende ![]() ![]() ![]() ![]() ![]() |
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
|
AW: Datei auf Indikatoren für Binärdatei testen?
Nur um das Ganze nochmal kurz zu erklären:
* man kann nicht prüfen "ist das eine Textdatei" * man kann nur prüfen "ist das keine Datei eines/mehrerer bestimmter Textformate" (vermutlich ungültige Zeichen/Kodierungen enthalten) * Kodierungen ala UTF-8 haben den Vorteil, daß sie erkennbare/prüfbare Strukturen besitzen (solange Nicht-ASCII-Zeichen enthalten sind) * soll es genauer sein, dann muß man eine linguistische Analyse vornehmen (also auf den Inhalt, ob der einem erlaubten Format entspricht) * 100%ig sicher kann aber niemals etwas werden Man muß also zuerst versuchen die Kodierung zu erkennen und kann sich nach Dekodierung den Inhalt ansehn. |
AW: Datei auf Indikatoren für Binärdatei testen?
Vielleicht sollte ich das, was ich in der Eingangsfrage gesagt habe, nochmals wiederholen, um Missverständnisse wie jenes von "perlsau" aufzuklären: Ich habe nicht gesagt, dass ich den Anspruch habe, ein perfektes Unterscheidungskriterium für Text- und Binärdateien zu schaffen. (Denn das kann es nicht geben). Ich habe ausdrücklich danach gefragt, welche weiteren Indikatoren für Binärdateien es noch geben könnte. Nichts anderes. Da kam der nützliche Hinweis zu den ControlBytes und zu den Doppel-NullBytes, was ich auch umgesetzt habe. Nochmals danke dafür. Auch für alle anderen sachlichen Anregungen vielen Dank! Aber bitte sachlich und erwachsen bleiben ...
|
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
|
AW: Datei auf Indikatoren für Binärdatei testen?
IMHO sollten mit #19 von himitsu und #20 von PeterPanino alle abklärungsbedürftigen Ansätze abgehandelt sein.
Für mich z.B. ist es nur *wahrscheinlich* ermittelbar, ob eine Datei "menschenlesbaren Text" enthält, nicht *absolut*. "Menschenlesbarer Text" enthält immer ein Leerzeichen zwischen den Wörtern (in den mir bekannten Sprachen). Just my two cents :oops: |
AW: Datei auf Indikatoren für Binärdatei testen?
Übrigens: Ich benötige die Funktion dafür, um zu entscheiden, ob der Inhalt einer Datei in eine PDF-Datei als Text ausgegeben werden kann oder nicht. Deshalb ist für diesen Zweck allein maßgeblich, dass die Datei KEINE BINÄRDATEI ist.
|
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
erfolgsversprechender sind da schon eher die "Magic Bytes". Ich vermute, daß ein hoher Anteil an "e" und x0D0A auf eine Textdatei verweist, gegen eine Textdatei würden Push/Pop-Sequenzen mehrere NOPs und #00 sprechen. Eine weitere Möglichkeit wäre es, Buchstabenkombinationen, die sprachspezifisch sind auf ihr Vorkommen zu prüfen. Gruß K-h |
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
Wie gesagt, ich möchte nur prüfen, ob es keine Binärdatei ist. Könntest du mir bitte erklären, was du mit "Push/Pop-Sequenzen mehrere NOPs" meinst? #00 Habe ich ja schon ausgeschlossen (immer mit dem Kriterium der annähernden Wahrscheinlichkeit). |
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
|
AW: Datei auf Indikatoren für Binärdatei testen?
Ich kacke mal Korinthen. :stupid: 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.
Zitat:
|
AW: Datei auf Indikatoren für Binärdatei testen?
Zitat:
![]() ![]() ![]() Der Hinweis, auf das Vorkommen von e oder E zu prüfen, da dieser Buchstabe in der deutschen Sprache überdurchschnittlich häufig vorkommt, ![]() ![]() Wenn es nur um die deutsche Sprache geht, hilft vielleicht die ![]() Was zur Lösung des Problems noch weiterhelfen würde, ist die bereits mehrfach gestellte, aber bislang unbeantwortete Frage, wie du eine Textdatei definierst: PostScript ist auch Text, Unit-Dateien enthalten lesbaren Text usw. Wieso antwortest du nicht auf meine Fragen: "Was meinst du damit, ich würde einiges, insbesondere die Perspektive, mißverstehen? Welche Perspektive meinst du? Könntest du vielleicht etwas genauer bezeichnen, was ich deiner Ansicht nach mißverstehe? Wie sonst sollte ich mein Mißverständnis nachvollziehen und auflösen können?" |
AW: Datei auf Indikatoren für Binärdatei testen?
Nochmals vielen Dank für all die sicherlich gut gemeinten Ratschläge zur Erkennbarkeit von Textdateien, aber trotzdem möchte ich nochmal auf den Titel dieses Themas und somit auf die Ausgangsfrage hinweisen: "Datei auf Indikatoren für Binärdatei testen?". Die Frage war also nicht "Datei auf Indikatoren für Textdatei testen?". Das Eine ist nicht das Gegenteil vom Anderen, wegen der prinzipiellen Restunsicherheit sowohl bei Ein- als auch Ausschlusskriterien. Wie bereits dargelegt, habe ich mich auf meinen Zweck bezogen für die AUSschließung von Binärdateien entschieden. Ich halte diese Methodik für nicht kompatibel mit der EINschließung von Textdateien. Empirisch gesehen scheint die Ausschlussmethode bessere Ergebnisse zu produzieren.
|
AW: Datei auf Indikatoren für Binärdatei testen?
Ich habe jetzt den Hinweis von @mjustin (Posting #8) berücksichtigt, dass UTF-32-enkodierte Dateien auch Doppel-NullBytes enthalten können und deshalb eine Prüfung auf UTF-32 BOM eingefügt (BE und LE), wenn ein Doppel-NullByte angetroffen wird, da ich optimistischerweise davon ausgehe, dass UTF-32-enkodierte Dateien einen BOM enthalten. Damit wird die Rest-Unsicherheit für den Ausschluss von Binärdateien verkleinert. Eine weitere Verkleinerung dieser Rest-Unsicherheit bei einem Doppel-NullByte-Vorkommen in einer Datei ohne UTF-32 BOM könnte man nur durch eine aufwendige statistische oder linguistische Analyse der in der Datei enthaltenen Bytes erreichen.
Delphi-Quellcode:
So bleibt als nächster Schritt nur noch die zusätzliche Prüfung auf UTF-16 BOM beim Antreffen der Mindestzahl von verbotenen ControlBytes.
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); 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; 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 := 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?
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 ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 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 by Thomas Breitkreuz