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 0001Umsetzung 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 - Bitsind 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