backdraft Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Hi! Ich habe irgendwie n Brett vorm Kopf... wie kann ich am einfachsten sicher prüfen, ob eine Datei im Ascii- oder Binärformat vorliegt? MfG backdraft Zitieren
Guybrush Threepwood Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Hmm...ich weiß gar nicht ob mann das so einfach feststellen kann. Aber unter Windwos gibt es eine API um zumindest festzustellen ob es sich um eine ausführabre Datei handelt. GetBinaryType() Zitieren
FinalFantasy Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Ich glaub nicht, dass das möglich ist, es sei denn, es kann über die Dateiattribute vom Dateisystem ermittelt werden. Ansonsten kannst du ja jede Datei sowohl Binär als auch als Text auslesen. Ist ja praktisch auch kein unterschied, ausser dass im einen für Menschen lesbarer "Code" steht, und in der anderen eben für Maschinen. *gg* Zitieren
nic_power Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Hallo, die einzige zuverlässige und portable Lösung ist das komplette Abarbeiten der Datei in dem Du jedes einzelne Zeichen daraufhin überprüfst, ob es sich um ein ASCII-Zeichen handelt. C stellt dafür "isascii() & Friends" zur Verfügung. Nic Zitieren
FinalFantasy Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Welches Zeichen is denn ASCII und welches nicht? Zitieren
nic_power Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Hallo, eine Beschreibung des ASCII-Zeichensatzes gibt es beispielsweise hier: http://www.asciitable.com/ oder unter Linux über das Kommando "man ascii". Im Prinzip sind das alle Zeichen, bei denen das High-Order Bit nicht gesetzt ist (ob dabei das Ergebnis "menschenlesbar" ist oder nicht spielt keine Rolle). Nic Zitieren
HELLmut Geschrieben 26. Februar 2004 Geschrieben 26. Februar 2004 Das versteh ich nicht ? Wenn du eine Datei 8-Bit oder char - weise ausliest, erhälst du Binärzahlen von 0 bis dezimal 255. Jede dieser Zahlen entspricht einem ASCII Zeichen. Binaries haben doch n ne bestimmte "Signatur" vorne dran, die sio als solche kennzeichnet, oder? Zitieren
nic_power Geschrieben 26. Februar 2004 Geschrieben 26. Februar 2004 Hallo, Original geschrieben von HELLmut Das versteh ich nicht ? Wenn du eine Datei 8-Bit oder char - weise ausliest, erhälst du Binärzahlen von 0 bis dezimal 255. Jede dieser Zahlen entspricht einem ASCII Zeichen. Nein, wenn Du Dir die beiden Links bzw. die Manpage anschaust, wirst Du feststellen, dass der ASCII-Code nur im Bereich von 0-127 (Dez) liegt. Alles darüber sind keine (!) ASCII-Zeichen sondern gehört zum Extended ASCII. Eine Datei, in der Du ein Zeichen mit dem Dezimalwert 180 findest ist keine ASCII-Datei. Binaries haben doch n ne bestimmte "Signatur" vorne dran, die sio als solche kennzeichnet, oder? Nein, es gibt keine allgemeingültige Signatur für Binary-Dateien da das Dateiformat immer von den Programmen abhängig ist, die es erzeugt hat ("File" usw. versuchen nur einen Best-Guess). Wenn in der Ursprungsfrage mit ASCII "menschenlesbar" gemein war, können die entsprechende C-Funktionen/Makros verwendet werden s.o. Nic Zitieren
HELLmut Geschrieben 26. Februar 2004 Geschrieben 26. Februar 2004 widersprech ich nicht, nur das für die ursprügliche frage: "ascii oder binär" meine aussage schon stimmt. das das jetzt extended ascii ist, wusste ich nicht, ändert aber nichts an der aussage Zitieren
FinalFantasy Geschrieben 26. Februar 2004 Geschrieben 26. Februar 2004 Ist aber auch irgendwie ein Schmarrn mit dem 0-127, weil wieso sollte dann der ASCII-Standard 8bit/Zeichen vorsehen? Da könnt ich ja gleich sagen, ich les die Datei 19bit weise aus, und was ist es dann? ASCII oder binär? Les ich nämlich ne Datei dann nur 7bit weise aus, ist deiner Definition nach alles ASCII. Nach dem was ich gelernt habe, geht der ASCII-Standard sehr wohl von 0-255 Zeichen, wobei 128-255 für sonstige Zwecke reserviert sind, z.B. Codepages. AFAIK stehen in diesem Bereich auch die deutschen Umlaute, wenn man die richtige Codepage auswählt. Zitieren
nic_power Geschrieben 26. Februar 2004 Geschrieben 26. Februar 2004 Hallo, Original geschrieben von FinalFantasy Ist aber auch irgendwie ein Schmarrn mit dem 0-127, weil wieso sollte dann der ASCII-Standard 8bit/Zeichen vorsehen? Da könnt ich ja gleich sagen, ich les die Datei 19bit weise aus, und was ist es dann? ASCII oder binär? Les ich nämlich ne Datei dann nur 7bit weise aus, ist deiner Definition nach alles ASCII. Nach dem was ich gelernt habe, geht der ASCII-Standard sehr wohl von 0-255 Zeichen, wobei 128-255 für sonstige Zwecke reserviert sind, z.B. Codepages. AFAIK stehen in diesem Bereich auch die deutschen Umlaute, wenn man die richtige Codepage auswählt. Also nochmal: Der klassische ASCII-Zeichensatz ist im Bereich von 0-127 standardisiert! Falls Du was anderes gelernt hast, dann ist dies (leider) falsch. Umlaute sind dort nicht vorgesehen worden, da es sich um einen US-Amerikanischen Standard handelt der im Jahre 1968 verabschieded wurde ("American Standard Code for Information Interchange"). In diesem Standard sind genau 128 ASCII-Zeichen standardisiert worden (nicht mehr und nicht weniger). Das ist ein Fakt, läßt sich nicht (!) ändern und es macht auch überhaupt keinen Sinn, darüber lange zu diskutieren. Liess doch einfach mal bei den obigen Links nach oder bemühe eine der gängigen Suchmaschinen. Die Zeichen oberhalb 127 waren im ursprünglichen ASCII-Zeichensatz nicht (nicht!) enthalten sondern stehen erst im extended ASCII zur Verfügung. Nic Zitieren
HELLmut Geschrieben 27. Februar 2004 Geschrieben 27. Februar 2004 Wie ich das sehe gehts hier nur darum, dass das was häufig (zB in einigen Büchern, zumindest aber in einem) als ASCII bezeichnet wird, genau genommen das erweiterte ASCII ist. Das ist historisch natürlich ungeheuer interessant und offensichtlich auch richtig. Für die Diskussion bringt es aber eiegentlich nichts, da man dadurch nur zwischen reines ASCII vs. ASCII ext. oder binär unterscheiden kann, was ja genau nicht die Frage war. Zitieren
Guybrush Threepwood Geschrieben 27. Februar 2004 Geschrieben 27. Februar 2004 Original geschrieben von HELLmut Wie ich das sehe gehts hier nur darum, dass das was häufig (zB in einigen Büchern, zumindest aber in einem) als ASCII bezeichnet wird, genau genommen das erweiterte ASCII ist. Das ist historisch natürlich ungeheuer interessant und offensichtlich auch richtig. Für die Diskussion bringt es aber eiegentlich nichts, da man dadurch nur zwischen reines ASCII vs. ASCII ext. oder binär unterscheiden kann, was ja genau nicht die Frage war. Ich verstehe ehrlich gesagt nicht was du willst. Es war die Frage wie man feststellt ob es sich um eine ASCII Datei handelt und nic_power hat die Lösung genannt und darauf hingewiesen das der ASCII Zeichensatz von 0-127 Zeichen geht. Was vollkommen richtig ist,daran ändert sich auch nichts wenn die Frage evtl. ungenau gestellt worden ist Zitieren
nic_power Geschrieben 29. Februar 2004 Geschrieben 29. Februar 2004 Hallo, aus dem Grund hatte ich auch extra nochmals nachgefragt, ob es nicht eher um die Erkennung von "menschenlesbaren" Dateien Leider ist der Irrglaube (wie auch der Thread zeigt) weit verbreitet, das ASCII ein 8 Bit-Format ist bzw. nur Chars enthält, die auch im Alphabet wiederzufinden sind (was aber _nicht_ der Fall ist). Ob die Datei im ASCII-Format vorliegt, läßt sich entweder über die oben erwähnte C-Funktion (bzw. das Makro) herausfinden oder über einen einfachen Vergleich, der einfach das 7. Bit abfragt: if ((© & ~0x7f) == 0). Dankenswerterweise stellt die Standard-Bibliothek auch Funktionen/Makros zur Verfügung die überprüfen, ob es sich um menschenlesbare Daten handelt. Eine sehr gute Annäherung liefert z.B. "isprint()". Nic Zitieren
computercrustie Geschrieben 1. März 2004 Geschrieben 1. März 2004 Original geschrieben von FinalFantasy Ist aber auch irgendwie ein Schmarrn mit dem 0-127, weil wieso sollte dann der ASCII-Standard 8bit/Zeichen vorsehen? Da könnt ich ja gleich sagen, ich les die Datei 19bit weise aus, und was ist es dann? ASCII oder binär? Les ich nämlich ne Datei dann nur 7bit weise aus, ist deiner Definition nach alles ASCII. Nach dem was ich gelernt habe, geht der ASCII-Standard sehr wohl von 0-255 Zeichen, wobei 128-255 für sonstige Zwecke reserviert sind, z.B. Codepages. AFAIK stehen in diesem Bereich auch die deutschen Umlaute, wenn man die richtige Codepage auswählt. Das nennt sich dann aber ANSI-ASCII und ist, wie du richtig bemerkt hast, eine Länderspezifische Erweiterung. Zum eigentlichen Thema: man könnte prüfen, ob sich etwaige Sonderzeichen (nicht Steuerzeichen wie Tab, CR, LF etc.) in der Datei befinden und anhand dieser dann festlegen, ob es eine lesbare Datei ist oder nicht (aber das tun die angesprochenen Makros hier sicherlich) Zitieren
Knuddlbaer Geschrieben 8. März 2004 Geschrieben 8. März 2004 Original geschrieben von nic_power Hallo, die einzige zuverlässige und portable Lösung ist das komplette Abarbeiten der Datei in dem Du jedes einzelne Zeichen daraufhin überprüfst, ob es sich um ein ASCII-Zeichen handelt. C stellt dafür "isascii() & Friends" zur Verfügung. Nic Das berücksichtigt aber die Umlaute etc. nicht. Ich musste mal sowas in der Art programmieren. Ich habe dafür ein Funktionsobjekt erstellt das man nach belieben abändern kann. Viel spaß mim Source.... // isascii.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <iterator> #include <iostream> #include <fstream> #include <algorithm> #include <functional> #include <locale> using namespace std; namespace { bool isUmlaut(char zeichen) { // korrigiere_signed_char(zeichen); return zeichen == 'ä' || zeichen == 'ö' || zeichen == 'ü' || zeichen == 'Ä' || zeichen == 'Ö' || zeichen == 'Ü'; } bool isSonderzeichen(char zeichen) { // korrigiere_signed_char(zeichen); return isUmlaut(zeichen) || zeichen == 'ß'; } } struct test : public unary_function<unsigned char,bool> { bool operator()(unsigned char i) const { static locale loc ( "German_Germany" ); //return isalpha(i,loc); return isalnum(i,loc) || isspace(i,loc) || isprint(i,loc) || isUmlaut(i);; } }; int main(int argc, char * argv[]) { if(argc<2) { cout<<argv[0]<<"filename to test"; return 20; } ifstream infile(argv[1],ios::in|ios::binary); if(!infile) { cout<<"can't open "<<argv[1]; return 20; } istreambuf_iterator<char> beg(infile); istreambuf_iterator<char> end; istreambuf_iterator<char> pos; pos = find_if(beg,end,not1(test())); if(pos == end) cout<<"ascii"; else cout<<"binary"; return 0; } [/PHP] Zitieren
nic_power Geschrieben 8. März 2004 Geschrieben 8. März 2004 Hallo, Original geschrieben von Knuddlbaer Das berücksichtigt aber die Umlaute etc. nicht. *Seufz* Sehr richtig. Wenn Du den Thread mal komplett gelesen hättest, hättest Du festgestellt, dass die Umlaute nicht zum ASCII-Code gehören. return isalnum(i,loc) || isspace(i,loc) || isprint(i,loc) || isUmlaut(i);; Noch mehr Redundanzen konntest Du da wohl nicht einbauen? Wirf mal einen Blick in die Manual-Page zu den verwendeten Funktionen, und überlege, ob der Einsatz von "isalnum()" in Kombination mit "isprint()" sinnvoll ist. Ich nehme ab, dass Du mit Deiner Funktion ermitteln möchtest, ob das Argument ASCII Charaktere und/oder deutsche Sondernzeichen enthält, aber warum wird dann isSonderzeichen() nicht verwendet? Nic Zitieren
Knuddlbaer Geschrieben 8. März 2004 Geschrieben 8. März 2004 Angesichts der Tatsache das locales eingesetzt werden ist es nicht garantiert das isalnum in isprint enthalten ist. Ich sehe aber isspace als überflüssig an da dies wohl in isprint enthalten ist. Wenn Du die Beiträge nicht genauso oberflächlich lesen würdest wie ich würde Dir auffallen das es kein Source ist der auf das eigentliche Problem passt, sondern nur für den Fragenden eine Möglichkeit geben sollte sehr individuelle Regeln für das erkennen geben sollte. Es war einfach nur der Ausschnitt aus einem Source der innerhalb eines Projektes eine spezielle Aufgabe übernommen hat der für den damalig eingesetzten Compiler ein paar workarounds brauchte. Wenn Dir nun etwas daran gelegen wäre das jemand der den Code verwendet ein besseres Ergebnis hat, hätte da bestimmt ein neuer Vorschlag der Routine gestanden. So wurden nur Erbsen gezählt ohne die Zutaten der Verpackung gelesen zu haben. (btw wäre isascii mit isSonderzeichen eine brauchbare kombination, wobei ich isSonderzeichen heute anderst Implementieren würde. Hierbei wäre aber eventuell das Ergebnis falsch wenn isalnum in der verwendeten locale nicht in isascii liegen sollte) Der Source stellt eine Möglichkeit da geändert zu werden auf die persönlichen Bedürfnisse. Wer nicht will braucht den nicht nehmen. Zitieren
Knuddlbaer Geschrieben 18. März 2004 Geschrieben 18. März 2004 @nic Sry, der Beitrag von mir war am Thema vorbei und hatte sich gedanklich um einen Beitrag in einem anderen Forum der ähnliches Thema hatte. Die Antwort(en) von mir waren unpassend und unhöflich. sry Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.