textdatei bitweise einlesen? last help wanted!! HÜÜLLFÄÄÄ xDDD



  • hallo!

    kann ich eine datei auch bitweise einlesen? wenn ich die mit ifstream einlese ist das ja char für char aber geht das nicht auch in 1en und 0en?

    🙂

    da hokage



  • Auf Systemebene ist char das kleinste, was du geschlossen verarbeiten kannst. Aber du kannst dir ja die eingelesenen char's noch weiter zersplittern, wenn du es unbedingt brauchst ( (c>>n)&1 liefert dir das n'te Bit auch dem Wert c).



  • also circa so?

    char mein_char;
    unsigned char mein_char_split; //muahaha gleich ma geändert :D
    char = input.get();
    while (!input.eof()) {
    mein_char_split = (mein_char>>n)&1;
    mein_char = input.get();
    }
    

    🙂



  • Die Frage ist, welchen Datentyp du verwenden willst, um die Binärdaten abzuspeichern?

    Meistens wird ein unsigned char benutzt, was dem Datentyp BYTE entspricht.

    Was du benutzen kannst ist ios::binary, um Binärdateien zu öffnen.



  • @hokage: Fast, nur solltest du im inneren der Schleife alle Bits des letzten Eingabezeichens nacheinander verarbeiten (am besten in einer Schleife for(n=0;n<8;++n)... oder for(n=7;n>=0;--n)... ), es sei denn, du willst aus jedem Byte wirklich nur ein einzelnes Bit weiterverwenden.



  • ahh hilfe!!

    wie könnte ich des denn machen? das ich dann alles hab in einem array oder so? kann mir da ma bitte wer den code schicken mit der schleife ? ich hab echt keine gute idee,..



  • ok, ich muss den thread ma auf die liste oben setzen

    *schreib*



  • Steht doch eigtl schon alles da was du brauchst.

    Also 1. Schritt, lies deine Datei am besten erst mal komplett ein, so dass du die ganzen Daten in nem (unsigned)Char-Array hast. Das dürftest du ja wohl hinbekommen.

    2. Es gibt in der STL sogar schon einen Container, für Bitmengen, namens bitset. Da könntest du jetzt die Bits aus deinem Char-Array abspeichern. Aber ich nehme mal an, dass du das nicht kennst, deshalb kannst ja mal nur fürs Verständnis einfach nen int-Array nehmen (der halt nur aus 1en und 0en besteht). Kommt letztendlich vom Prozedere sowieso aufs gleiche raus.

    Also angenommen du hast deine Daten in deinem Char-Array stehen, dann kannst du wie folgt vorgehen (Pseudocode)

    char array[10]; //Hier stehen die Daten drinnen (also hier jetzt 10 chars)
    int* pBitArray = new int[10 * 8]; //wir wollen ja jedes bit speichern, und ein char hat 8 bits
    
    for (unsigned i=0; i<10; i++)
    {
        char c = array[i];
        for (unsigned j=0; j<8; j++)
        {
            pBitArray[i*8 + j] = (c >> j) & 1; //Erst Bit 0, dann Bit 1, ... bis Bit 7
        }
    }
    

    Wenn du es in ner andern Reihenfolge willst, musst halt kurz paar Sachen ändern, aber das sollte klar sein...

    P.S. Nix getestet oder so



  • Schreib' dir doch ne kleine Klasse der du nen istream gibst und die dir dann eine ReadBit Funktion zur Verfügung stellt - und das ganze "in Bits zerschneiden" kapselt. Ist auch gleich ne gute Übung.

    Header File könnte inetwa so aussehen:

    class BitStreamReader
    {
    public:
        explicit BitStreamReader(std::istream& is);
        bool ReadBit();
        bool IsEOF() const;
    
    private:
        std::istream& m_is;
        int m_buffer;
        unsigned m_bitsInBuffer;
    };
    

Anmelden zum Antworten