Wie komm ich an die Bits ?



  • Wie kann ich die Bits einer Datei in einen ifstream einlesen ?
    Wenn ich eine Datei mit dem Editor ansehe, sehe ich ja nicht Einsen und Nullen, sondern irgendwelche Hyroglyphen, aber wie komme ich an die Einsen-und-Nullen-Folge einer Datei ?



  • Die Hyroglyphen sind vermutlich hexadezimale Zahlen und sind ein Zahlensystem basierend auf 16.

    Wenn Du die einzelnen Bits willst, mußt Du dir ein Byte (oder eine bestimmte Menge davon) nehmen und dieses in Bits aufteilen.

    In C++ kannst Du das mit "Shift" und mit "And" machen.

    int iCounter;                  // Präfixe find ich super!!!! (nur kein Widerspruch ;) )
    char cBits[8];                 // 8 Bytes Platz für jedes Bit eines
    
    ..... // irgendwelcher Code zum Lesen eines Bytes aus einer Datei
    
    // Annahme: das zu betrachende Byte steht in char cByte.
    
    for(iCounter = 0; iCounter < 8; iCounter++){
       if (cByte & 1)
          cBits[iCounter] = '1';   // Bit ist gesetzt
       else
          cBits[iCounter] = '0';   // Bit ist aus
       cByte >>= 1;                // alle Bits um 1 Position nach rechts schieben
    }
    

    Mann könnte das noch etwas eleganter machen (Zuweisung in cBits[] durch Zeiger ersetzen), aber so ist es vermutlich einfacher zu verstehen.

    Was Du aber mit einer Dateianzeige mit lauter 0 und 1 willst, ist mir absolut schleierhaft.... (es sei denn Du suchst Schwarzweiß-Grafiken)...

    Edit: da war noch ein Tippfehler drine... 🙄



  • JFK schrieb:

    ..... // irgendwelcher Code zum Lesen eines Bytes aus einer Datei
    

    Grade das interessiert mich ja. Wie lese ich Bits oder auch Bytes aus einer Datei. Ich will keine char in ifstream einlesen sondern eine Eins oder ne Null.
    Trotzdem danke für deine Antwort !



  • OK nochmal zum mitmeißeln:

    1. Du liest ein BYTE aus der Datei
    2. Du zerlegst das Byte in BITS.

    Wie das zweite geht hat dir JFK schon verraten.



  • Clyde schrieb:

    JFK schrieb:

    ..... // irgendwelcher Code zum Lesen eines Bytes aus einer Datei
    

    Grade das interessiert mich ja. Wie lese ich Bits oder auch Bytes aus einer Datei. Ich will keine char in ifstream einlesen sondern eine Eins oder ne Null.
    Trotzdem danke für deine Antwort !

    Du kannst aber nur Bytes einlesen (also ein char) für Bits gibts nun mal keine Funktion ausser zu zerlegst das Byte wie oben schon gezeigt in Bit's

    Joe



  • ABER WIE LESE ICH DENN BYTES AUS EINER DATEI !?

    Z.B. liest folgendes doch die Zeichen, die man auch mit dem editor sieht, aber nicht die Folge von Einsen und Nullen.

    int main ()
    {
        ifstream datei;
        char zeichen;
    
        datei.open("Text.txt");
        if(datei!=0)
        {
            while(!datei.eof())
            {
                datei>>zeichen;
                if(!datei.fail())
                cout<<zeichen;
                else
                return 1;
            }
        }
        else
        cout<<"Konnte Datei nicht oeffnen !"<<endl;
    
    return 0;
    }
    

    So in der Art. Aber was muss ich machen damit die Einsen und Nullen aus denen die Datei besteht eingelesen werden ? Ich weiß nicht wie ich das anders ausdrücken soll.



  • Ich glaub mir dämmerts grad...

    Ein char in der Datei entspricht einem Byte, stimmts ? Die Bits sind ja nur die acht Stellen der binären Darstellung der Zahl die das Byte repräsentiert. Ist das so richtig ? Die Datei besteht aus lauter achtstelligen binären Zahlen, wobei jede Zahl ein bestimmtes Zeichen (z.B. im Editor) bedeutet.



  • Zeichen sind Bytes



  • Ich glaube dann hab ichs kapiert. Danke an alle !

    Nur diese eine Zeile verstehe ich nicht:

    if(cByte & 1)
    

    Wieso steht dieses bitweise UND da ? Was bedeutet die Zeile ?



  • es wird verglichen ob das letzte bit gesetzt ist oder nicht. z.B 101101 - bit gesetzt 101100 - nicht gesetzt usw



  • Aber was hat denn das bitweise UND mit dem Prüfen des letzten Bits eines Bytes zu tun ? Und wieso das letzte und nicht das erste ? 😕



  • Na ganz einfach:

    1 -> 0000 0001
    1 -> 0000 0001 UND-Verknuepft
    --------------
    0000 0001 = Das letzte bit ist gesetzt

    1 -> 0000 0001
    2 -> 0000 0010 UND-Verknuepft
    --------------
    0000 0000 = Das letzte bit ist nicht gesetzt

    mfg
    v R



  • virtuell Realisticer schrieb:

    Na ganz einfach:

    1 -> 0000 0001
    1 -> 0000 0001 UND-Verknuepft
    --------------
    0000 0001 = Das letzte bit ist gesetzt

    1 -> 0000 0001
    2 -> 0000 0010 UND-Verknuepft
    --------------
    0000 0000 = Das letzte bit ist nicht gesetzt

    mfg
    v R

    Ach soooooooooooooo ! Na klar ! Da stand ich aber voll auf dem Schlauch. Danke für eure Geduld



  • Jetzt hab ich das Programm geschrieben, aber er gibt am Ende immer noch zehn Nullen aus. Kann das vielleicht an dem while(!file.eof()) liegen ? Kommt nach dem letzten Zeichen in der Datei doch noch was ?



  • Ich habe das Gefühl, dass bei der Ausgabe hinter jedes letzte Bit eines Bytes noch eine Null gehängt wird, wieso ?



  • Clyde schrieb:

    Ich habe das Gefühl, dass bei der Ausgabe hinter jedes letzte Bit eines Bytes noch eine Null gehängt wird, wieso ?

    1.) Warum hast du das Gefühl?
    2.) Zeig doch mal Code wenn dir jemand helfen soll...



  • Das ist so die Rohversion von meinem Programm:

    #include <iostream.h>
    #include <fstream.h>
    
    int main ()
    {
    	ifstream read("datei.txt");
    	char bits[8];
    	char byte;
    
    	cout<<endl;
    	if(read!=0)
    	{
    		while(!read.eof())
    		{
    			read>>byte;
    			if(!read.fail())
    			{
    				for(int i=0;i<8;++i)
    				{
    					if(byte & 1)
    						bits[i]='1';
    					else
    						bits[i]='0';
    
    					byte>>=1;
    				}
    				for(int i=0;i<8;++i)
    					cout<<bits[i];
    			}
    			else
    			{
    				cout<<"Fehler beim Lesen der Datei !"<<endl<<endl;
    				return 1;
    			}
    
    		}
    		cout<<endl<<endl;
    	}
    	else
    	{
    		cout<<"Datei nicht gefunden !"<<endl<<endl;
    	}
    
    return 0;
    }
    


  • Nu nimmste mal dein Visual C++ oder was du auch immer als Programmierumgebung hast, und schmeisst den Debugger an. Lies mal den Verlinkten Artikel zum Thema Debuggen. Ist zwar Borlandspezifisch aber die Vorgehensweisen sind in jeder IDE realtiv ähnlich.

    noch ne Anmerkung zu JFK's Code: Im Prinzip wärs eleganter die Bitmaske statt der Daten zu shiften, da dann die Ursprungsdaten nicht zerstört werden.

    -junix



  • Nö, ist doch im Prinzip richtig (mal abgesehen davon, dass es nicht kompilieren wird)

    Schreibe oben anstatt...

    #include <iostream.h>
    #include <fstream.h>
    

    ...einfach...

    #include <iostream>
    #include <fstream> 
    using namespace std;
    

    Und siehe da, es kompiliert.



  • @junix: da haste wohl recht. Aber es sollte ja einfach sein und nicht elegant.


Anmelden zum Antworten