Binär-Daten als 0en und 1en anzeigen
-
Hi zusammen ich will aus einer Datei binär Daten auslesen und die dann in ein integer casten. Zum probieren hab ich versucht mir auch die binären Daten auszugeben. Als Beispiel wollte ich als Ausgabe für Byte XY dez. 11 und Binär 00001011 wie realisiere ich das? Bisher hab ich folgendes versucht:
{ UpdateData(true); // using namespace std; unsigned long decimal=0; int length = 0; fstream FileBin("d:\\test.wav", ios::in|ios::out|ios::binary); if (FileBin.is_open()) { // 1. Dateigröße bestimmen. FileBin.seekg(0, ios::end); unsigned long FileSize = streamoff(FileBin.tellg()); FileBin.seekg(0, ios::beg); // 2. Puffer anlegen und Datei einlesen. char* pBuffer = new char[8]; FileBin.seekg(m_lEingabe); FileBin.read(pBuffer,1); CString Test = ""; for (unsigned int i = 0; i < 8; i++ ) { unsigned long decimal = (unsigned long)(unsigned char)pBuffer[i]; Test.Insert(i,pBuffer[i]); } m_lAusgabe = decimal; m_sAusgabe = Test; // Nachher wieder aufräumen. delete [] pBuffer; UpdateData(false); } else MessageBox("ERROR"); }
so und wenn ich jetzt ein Byte einlese, in dem laut Hexeditor 7A also 1111010 drin steht gibt er mir folgendes aus
zÍÍÍÍÍÍÍ
warum?
Wie krieg ich jetzt in die Ausgabe
1111010 ???
-
Hi, In deinem anderen thread habe ich dich wahrscheinlich falsch verstanden. auch jetzt ist mir nicht ganz klar was du wirklich willst. darum habe ich folgende programm geschrieben. Kannst dir aussuchen was besser passt.
#include <iostream> #include <iomanip> #include <string> unsigned long char_to_bin_long_value( const char a ) { unsigned char mask = 0x80; unsigned long dec_mask = 10000000; unsigned long ret = 0; for ( int i = 0; i < 8; i++ ) { if (( (unsigned char)a & mask ) == mask ) { ret += dec_mask; } dec_mask /= 10; mask = mask >> 1; } return ret; } std::string char_to_bin_string( const char a ) { unsigned char mask = 0x80; std::string ret; for ( int i = 0; i < 8; i++ ) { if (( (unsigned char)a & mask ) == mask ) ret += '1'; else ret += '0'; mask = mask >> 1; } return ret; } int main() { char c = 0x7a; std::cout << "als string '" << char_to_bin_string(c) << "'" << std::endl; std::cout << "als long " << std::setw(8) << char_to_bin_long_value(c) << std::endl; }
output
als string '01111010' als long 1111010
Kurt
-
Hi Kurt! char_to_bin_string ist genau das was ich als Kontrollausgabe haben wollte!
Aber (leider gibt es ein aber) das mit dem long war anders gemeint! long soll jetzt den decimalen Wert meiner binären Datei erhalten.
ist ein Byte 11111111 soll mein long 255 sein.00000011 soll 3 sein
00000111 soll 7 sein...
jetzt klarer?
-
Ein Char ist doch eine Zahl.
Den kannst du ganz einfach in einen long stopfen.
long lZahl = (long)pBuffer[i];
PS: Ich räume gleich mal unter deinen Mehrfachposts auf. Du bist aber fleissig heute...
-
Hi erstmal sorry für die mehrfachposts, dieses scheiß netzwerk raubt mir noch den letzten Nerv! Und diesmal hab ich ganz bewusst nicht aktualisieren gedrückt, nach dem Networkerror kam!
Tut mir echt leid! Ist echt keine Absicht.Estartu wenn ich das von dir grad mach hab ich für 1111 1111 als Ergebnis nicht
255 sondern 18828344Das kann doch nicht sein.
-
Hmm, Theorie und Praxis...
Ich habe gerade mal ausprobiert:
char ch = 10; long l = ch;
und l ist hinterher 10. Also so wie ich vermutet hatte.
Kannst du deinen Code mal auf ein Minibeispiel zusammenschrumpfen? Dann probier ich das mal aus.
Die Doppelposts sind doch nicht schlimm, außerdem war das Forum auch grade mal wieder weg...
-
Dank dir, Programm ist raus, ich hoff du findest was.
Aber du findest ja eigentlich immer wasVielen Dank
-
Hast schon Remail.
-
schau mal den ersten Post an, da hab ich den Fehler der drin war noch richtig! War also vor meiner ich-zerstückel-mal-alles-Attacke
Oh man
*meeDoof*
-
Hihi, naja Hauptsache, du lernst es irgendwann genauso wie deinen anderen Lieblingsfehler selber zu finden.
Und: Wegen sowas wurde Versionierung eingeführt.