BIT-Manipulationen



  • Folgendes Problem, Ich möchte von einer Datei (z.b. Txt)
    alle einzelnen BITs auslesen,

    Mein Ansatz war folgender, die Nutzdaten (data) byteweise auslesen:

    Streamdata->Read(&buffer,1);
    und mithilfe einer Bitmaske und bitweisen & herausfinden
    Bitmaske = 0000 0001

    Umsetzung in C++ sah folgendermaßen aus:

    BYTE maske=1;//0000 0001 Maske
            BYTE nutzbit[7];
            for(int i=0;i<8;i++)
            {
                    maske = maske << i-1; //Jeweils um 1 nach links
                    BYTE Bit   = buffer & maske;
                    Bit = Bit >> i;
                    nutzbit[i] = Bit;
            }
    

    Leider habe ich hier einen absoluten Denkfehler anscheinend drinnen,..
    könnte sich jemand meiner erbarmen und sich das mal ansehen und mir einen Rat geben ?

    Danke 🙂



  • Hallo

    Der einzige echte semantische Fehler ist das du ein Array mit 7 Elementen in einer Schleife mit 8 Durchgängen beschreiben willst.
    Ansonsten ist das recht ineffizient. Warum die Bits auseinanderreißen? Las sie doch im Byte und benutzt lieber acht einzelne Masken um On-The-Fly auf die einzelnen Bits zuzugreifen.

    bis bald
    akari



  • Weil das ganze weiterreicht dass ich einen Anderen Stream mit eben genau diesen Daten weiterverarbeiten will, war für mich einfach übersichtlicher im moment,
    naja....

    Ok hab ich ausgebessert, ich lade hierbei eine test.txt mit folgendem inhalt(00001111)...
    nun steht in meinem "buffer" aber nur "1" ???
    Kommt kompletter Nonsens raus ? (1,0,0,0,0,...)



  • Hallo

    Du bist mit dem Verschieben etwas durcheinander gekommen

    #include <iostream>
    
    using namespace std;
    
    typedef unsigned char BYTE;
    
    int main()
    {
      BYTE test = 3;
      BYTE maske=1;//0000 0001 Maske
      BYTE nutzbit[8];
      for(int i=0;i<8;i++)
      {
        BYTE Bit   = test & maske;
        Bit = Bit >> i;
        nutzbit[i] = Bit;
        maske = maske << 1; //Jeweils um 1 nach links
      }
      for (int i = 0; i<8;i++)
        std::cout << " <" << int(nutzbit[i]) << ">";
    
    }
    

    bis bald
    akari



  • Leider aber das gleiche phänomen ?

    Beim auslesen der datei test.txt (Inhalt: 00001111):

    0 - Bit
    0 - Bit
    0 - Bit
    0 - Bit
    1 - Bit
    1 - Bit
    0 - Bit
    0 - Bit

    sind die letzten 2 Bits falsch ?



  • Um es vollständig mal zu posten:

    Streamdata->LoadFromFile(datapath);
            Streamdata->Position=0;
    
            //Nun auslesen wie dieses Byte aufgebaut ist
            BYTE nutzbit[8];
            BYTE buffer=0;
            Streamdata->Read(&buffer,1);
    
            BYTE maske=1;//0000 0001 Maske
            for(int i=0;i<8;i++)
            {
                    BYTE Bit   = buffer & maske;
                    Bit = Bit >> i;
                    nutzbit[i] = Bit;
                    maske = maske << 1; //Jeweils um 1 nach links
            }
            for (int i = 0; i<8;i++)
                    Memo2->Lines->Add(IntToStr(nutzbit[i]) + " - Bit");
    


  • Hallo

    Nein mein Code ist schon in Ordnung.
    Hier noch in eine Funktion gepackt um zwei Zahlen zu testen, jeweils mit höchsten und niedrigsten Bit

    #include <iostream>
    
    using namespace std;
    
    typedef unsigned char BYTE;
    
    void bin_out(BYTE test)
    {
      BYTE maske=1;//0000 0001 Maske
      BYTE nutzbit[8];
      for(int i=0;i<8;i++)
      {
        BYTE Bit   = test & maske;
        Bit = Bit >> i;
        nutzbit[i] = Bit;
        maske = maske << 1; //Jeweils um 1 nach links
      }
      for (int i = 0; i<8;i++)
        std::cout << " <" << int(nutzbit[i]) << ">";
    }
    
    int main()
    {
      bin_out(1 << 7);
      std::cout << std::endl;
      bin_out(1);
    
    }
    

    bis bald
    akari



  • Ja dein Code stimmt,
    wenn ich nun statt
    BYTE Bit = buffer & maske;
    BYTE Bit = 0xAA & maske;

    schreibe stimmt mein Array komplett !

    Dann muss nun mein Fehler beim Auslesen der Datei sein ??

    Woeb idas auslesen nicht länger als:

    Streamdata->LoadFromFile(datapath);
            Streamdata->Position=0;
            BYTE buffer;
            Streamdata->Read(&buffer,1);
    

    ist ?
    das hier stimmt doch ?



  • Hallo

    Möglicherweise ist die Datei nicht korrekt? Hast du mit dem Debugger überprüft was in datapath steht? (Wenn es wirklich nur ein Pfad ohne Dateiname ist kann es nichts werden)

    bis bald
    akari


Anmelden zum Antworten