Bit to Byte Conversion



  • Hallo an alle!

    Ich suche eine Möglichkeit, aus 8 Bit ein Byte zu machen.

    Folgendes habe ich bereits:

    typedef unsigned char    word8;
    typedef bool             bit8[8];
    
    void ConvertToBit(word8 source, bit8 dest)
    {
    int i;
       for(i=0;i<8;i++)
          {
           dest[i]=source&0x01;
           source=source>>1;
          }
    }
    

    Auf diese Weise werden einem Array mit 8 Bool-Werten, alle Bit-Werte des Bytes zugeordnet.
    Dadurch dass die source mit 1 bitweise und verknüpft wird, werden alle anderen Werte des Bytes, bis auf das ganz linke gelöscht, und man kann Feststellen, ob das linke Bit nun gesetzt war oder nicht.

    Zur Veranschaulichung:
    0x01 entspricht 00000001, auch bekannt als 1 😉
    Nehmen wir an wir hätten als Byte dieses: 01110110

    00000001 &
    01110110 --> 00000000 = der 1. Bit Wert

    Dann wird unser Byte nach Rechts geschubst: 01110110 --> 00111011

    00000001 &
    00111011 --> 00000001 = der 2. Bit Wert

    usw...

    So kann man das ganze Byte durchgehen.

    Nun muss ich die 8 Bool Werte aber wieder zu einem Byte "zusammenstecken", als word8 typ eben.

    Was mir dazu eingefallen ist, ist folgendes:

    void ReconvertToByte(bit8 source, word8 dest)
    {
       for(i=0;i<8;i++)
          {
           dest=source[i];
           dest=dest<<1;
          }
    }
    

    So, dabei wird aber bei der = Zuweisung dest=dest<<1; jedesmal das ganze Überschrieben. Ich bräuchte eine Möglichkeit um die Bit-werte einfach aneinander zu hängen.

    Ich wäre sehr erfreut, wenn mir jemand helfen könnte.

    Gruß LBA



  • Versuchs mal mit
    dest |= source[i];



  • Mit deinem Prototypen bekommst du dest nicht zum Aufrufer zurück;
    Versuches so

    word8 ReconvertToByte( bit8 source ) {  
       word8 mask = 1; 
       word8 dest = 0;
       int i;
       for(i=0;i<8;i++) {
           if (source[i] )
              dest|=mask;
            mask <<=1;
       }
       return dest;
    }
    

    BTW komische typbezeichnungen.
    Kurt



  • Vielen Dank schonmal für die sehr hilfreichen Antworten!

    @ ZuK
    Dein Vorschlag gefällt mir gut! Du hast recht mir dem Rückgabewert, ich hab in meinem Programm keine einzelne Funktion für die Umwandlung geschrieben, sondern die Rechenanweisung in eine andere Funktion gepackt.

    Allerdings fand ich einen Fehler:

    Wenn man die for-schleife genauso ablaufen lässt wie bei der ByteToBit Funktion, dann wird das Byte genau umgedreht.

    for(i=7;i>-1;i--) sollte das ganze beheben.

    Dann müsste das funktionieren:

    for(i=7;i>-1;i--)
    		{	dest |= source[i];
    			dest = dest<<1;
    		}
    


  • lba schrieb:

    Wenn man die for-schleife genauso ablaufen lässt wie bei der ByteToBit Funktion, dann wird das Byte genau umgedreht.

    for(i=7;i>-1;i--) sollte das ganze beheben.

    Dann müsste das funktionieren:

    for(i=7;i>-1;i--)
    		{	dest |= source[i];
    			dest = dest<<1;
    		}
    

    Das bedeutet aber micht dass meine Version falsch ist. Deine Version funktioniert genau anders rum. ( du schiftest das Ergebnis ).
    Denke meine Version sollte funktionieren.
    BTW das ist das C-Forum sein. Weiss nicht was bool bei dir ist.

    Kurt



  • Jo du hast vollkommen recht 🙂

    bool ist seit dem ANSI C Standard 99 dabei. Er wird zur Darstellung der Boolschen Werte 0 und 1 eingesetzt. Normalerweise heißt er _Bool .
    Wenn du die Headerdatei <stdbool.h> inkludierst, kannst du auch bool und true und false als 1 bzw. 0 schreiben...

    Gruß lba



  • lba schrieb:

    Vielen Dank schonmal für die sehr hilfreichen Antworten!

    Allerdings fand ich einen Fehler:

    Wenn man die for-schleife genauso ablaufen lässt wie bei der ByteToBit Funktion, dann wird das Byte genau umgedreht.

    [/cpp]

    Den "Fehler" machst du auch bei ConvertToBit.


Anmelden zum Antworten