Datei Binär einlesen und Bytes/Bits in Text darstellen



  • Hi!

    Also ich lese eine Datei binär mit fstream in ein char array ein.
    Doch wie kann ich diese Bytes (0/1) in Textform darstellen?

    thx



  • Soweit ich weiß hat ein Byte mehr mögliche Werte als 0 und 1...

    Ich schätze du willst eine beliebige Zahl, z.B.

    int zahl = 48;
    

    in binärer Schreibweise auslesen?
    Das könnte man z.B. einfach so machen:

    void char2bin(char x)
    {
     for(int i=0; i < sizeof(char)*8 ; i++)
     {
      cout << ( x >> i & 1 );
     }
    }
    


  • nun gut,
    1 byte waren doch 8 bit.
    und ein bit war doch 0 oder 1?



  • Hallo

    Ersteres ist auf den meistens Rechnerplattformen so definiert und zweiteres ist immer so.
    Und wo ist nun das Problem? 😕

    bis bald
    akari



  • MAG schrieb:

    Soweit ich weiß hat ein Byte mehr mögliche Werte als 0 und 1...

    Ich schätze du willst eine beliebige Zahl, z.B.

    int zahl = 48;
    

    in binärer Schreibweise auslesen?
    Das könnte man z.B. einfach so machen:

    void char2bin(char x)
    {
     for(int i=0; i < sizeof(char)*8 ; i++)
     {
      cout << ( x >> i & 1 );
     }
    }
    

    Da wird die Bytestruktur falschrum ausgegeben! ;-P

    unsigned char reverse( unsigned char c )
    {
    	return ( ( c * 0x80200802ULL ) & 0x0884422110ULL ) * 0x0101010101ULL >> 32;
    }
    
    void char2bin( unsigned char x )
    {
    	unsigned char tmp = reverse( x );
    
    	for ( int i = 0; i < CHAR_BIT; ++i, tmp >>= 1 )
    	{
    		std::cout << ( tmp & 1 );
    	}
    }
    

    Oder so:

    void char2bin( unsigned char x )
    {
    	for ( int i = CHAR_BIT-1; i >= 0; --i )
    	{
    		std::cout << ( ( x >> i ) & 1 );
    	}
    }
    

    Oder so:

    std::cout << std::bitset< CHAR_BIT >( x );
    


  • Hi!

    Habs mal eingefügt, nur jetzt bekomm ich vom Compiler:

    *[Linker Fehler] Unresolved external 'TForm1::char2bin(unsigned char, Stdctrls::TMemo )' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\BYDER\BYDER.OBJ



  • Hallo

    Du hast wahrscheinlich die Methode der Klasse TForm1 als Member hinzugefügt aber bei der Implementation den Klassennamen vergessen
    Allerdings stellt sich die Frage ob die Funktion wirklich eine Membermethode von TForm sein muß. Entferne mal die Deklaration der Methode aus der Header-datei des Forms.

    bis bald
    akari



  • gut, ist entfernt nur bekomm ich dann:

    [C++ Fehler] Byder.cpp(78): E2268 Aufruf der undefinierten Funktion 'char2bin'

    **[Edit]**Hat sich erledigt, hattest recht, so jetzt probier ich die methode mal aus...



  • So, habe die Methode etwas abgeändert und so implementiert:

    AnsiString TForm1::char2bin( unsigned char x )
    {
        AnsiString d;
        for ( int i = CHAR_BIT-1; i >= 0; --i )
        {
           d  = ( ( x >> i ) & 1 );
        }
    }
    

    Und übergebe der Methode den Parameter 88.
    Jedoch scheint der Zurückgegebene String leer zu sein.



  • Dragonfire schrieb:

    d  = ( ( x >> i ) & 1 );
    

    vielleicht so

    d += ('0' + ( ( x >> i ) & 1 ));
    


  • bringt leider nichts



  • Guggigugg !

    Check this out Joe:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main(void)
    {
        string datei_inhalt = "ABC";
    	vector <char> bintext;
    
    	for( int i =0; i < datei_inhalt.size(); i++ )
    	{
    		for ( int j = 0; j < 8; j++ )
    		{
    			cout << ((datei_inhalt.at(i) >> j)&1); // Hier gibts Bits zu sehen
    			bintext.push_back(((datei_inhalt.at(i) >> j)&1));
    		}
    		cout << endl; // Buchstaben Byteweise für die Anzeige.
    	}
    
    	return 0;
    }
    


  • Dragonfire schrieb:

    So, habe die Methode etwas abgeändert und so implementiert:

    AnsiString TForm1::char2bin( unsigned char x )
    {
        AnsiString d;
        for ( int i = CHAR_BIT-1; i >= 0; --i )
        {
           d  = ( ( x >> i ) & 1 );
        }
    }
    

    Und übergebe der Methode den Parameter 88.
    Jedoch scheint der Zurückgegebene String leer zu sein.

    Deine Methode liefert keinen Wert zurück und weist zudem 8 mal der Variablen 'd' das Ergebnis des Ausdrucks zu. Macht irgendwie nicht viel Sinn.

    string TForm1::char2bin( unsigned char x )
    {
      string bin;
    
      for(int i = 7; i >= 0; i--)
      {
        bin += ( x >> i & 1 ) ? "1" : "0";
      }
    
      return bin;
    }
    

    So sollte es gehen. (Davon ausgehend, dass AnsiString ^= string)

    EDIT: Es heißt natürlich x >> i, und nicht i >> i ^^



  • das mit den 8mal war nur nen Test...
    Aber thx, ich werds mal ausprobieren. 😃



  • خِنْزِير

    Oink, oink? Was bedeutet der Kringel darüber?



  • so, nun gehts schon besser mit:

    String TForm1::char2bin( unsigned char x )
    {
      String bin;
    
      for(int i = 7; i >= 0; i--)
      {
        bin += ( i >> i & 1 ) ? "1" : "0";
      }
    
      return bin;
    }
    

    Jedoch erhalte ich als Ergebnis von 88 binär : 00000000



  • Tja, du solltest halt nicht blind Quelltext kopieren. 😛 😉

    Der Fehler ist ein Tippfehler meinerseits:

    bin += ( i >> i & 1 ) ? "1" : "0";
    

    Siehst du? i >> i
    Daher die ganzen Nullen. 😂
    Es muss natürlich

    bin += ( x >> i & 1 ) ? "1" : "0";
    

    heißen.



  • stimmt 😃 😃

    jedoch wird man sehr leicht dazu verleitet dem hirn mal ne Pause zu gönnen :p 😃



  • thx, funzt! 😃



  • Konrad Rudolph schrieb:

    خِنْزِير

    Oink, oink? Was bedeutet der Kringel darüber?

    das ist das ringelschwänzchen 😉



  • Wo ist denn eigentlich der Hund der eine ? Der unten rum wund, der an der Leine ?


Anmelden zum Antworten