Zum Inhalt springen

Brett vorm Kopf: prüfen ob Datei im Ascii-Format


backdraft

Empfohlene Beiträge

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*

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...