Bit in einem Byte "löschen"



  • Tagchen,

    Ich habe eine simple und kurze Frage.
    Nehmen wir an ich habe ein BYTE mit folgendem Inhalt vorliegen:
    10100111

    Was muss ich machen, damit das erste Bit aus dem BYTE verschwindet?:
    -0100111



  • -0100111 gibt es nicht. Was soll es sein, 00100111 oder 10100111?



  • zahl &= 127;
    


  • SG1 schrieb:

    -0100111 gibt es nicht. Was soll es sein, 00100111 oder 10100111?

    Der '-' soll nur dafür stehen, dass da jetzt was fehlt :p

    Also:
    10100111
    zu
    0100111

    DarkShadow44 schrieb:

    zahl &= 127;
    

    könntest du das auch erklären ;o?



  • 127 ist in binär 01111111. Dann hast du

    10100111
    01111111
    --------------- (&)
    00100111

    Und zahl &= 127 ist nichts anderes als zahl = zahl & 127.



  • Irgendwie lässt sich das ganze nicht auf mein Problem anwenden bzw. wende ich das ganze falsch an ;/

    Ich bekomme ein Integer von nem Server zugesendet.
    Dieser ist auf eine bestimmte Art und Weise kodiert.

    Nehmen wir an ich bekomme folgenden Integer vom Server (Binary):
    10101000 00010001 00000100 10111111

    Nun schaut man sich immer den ersten Bit eines BYTEs an, ist er nicht gesetzt,
    dann nimmt man den BYTE noch dazu und die restlichen lässt man weg, ist er gesetzt, geht man ein BYTE weiter.

    In dem Fall wäre das Ergebniss dann das hier:
    10101000 00010001

    Die anderen Bytes fallen weg, da im zweiten Byte der erste Bit nicht gesetzt ist.
    Nun muss man nur noch die ersten Bits wegnehmen und man hat seinen dekodierten Integer 🙂

    0101000 0010001

    So bisher hab ich das ganze so gelöst, aber das scheint irgendwie nicht zu funktionieren 😕

    int deserializeInt32(int input)
    {
    	BYTE bytes[4] = {0, 0, 0, 0};
    	memcpy(bytes, &input, sizeof(int));
    
    	if(!HIBYTE(bytes[0]))
    	{
    		bytes[0] &= 127;
    		return (int)bytes;
    	}
    
    	if(!HIBYTE(bytes[1]))
    	{
    		bytes[1] &= 127;
    		return (int)bytes;
    	}
    
    	if(!HIBYTE(bytes[2]))
    	{
    		bytes[2] &= 127;
    		return (int)bytes;
    	}
    
    	bytes[3] &= 127;
    	return (int)bytes;
    }
    


  • Irgendwie hast du da was durcheinandergebracht mit Bytes, Ints und Shorts.

    uint deserializeInt32(uint input)
    {
        uint result=0;
        BYTE bytes[4] = {HIBYTE(HIWORD(input)), LOBYTE(HIWORD(input)), HIBYTE(LOWORD(input)), LOBYTE(LOWORD(input))};
        for(int i=0; i<4; i++)
        {
            result <<= 7; // shifte bisherige werte nach links, (nur 7 da 1. bit wegfällt)
            result += bytes[i] & 127; // addiere 7 unteren bits des bytes (da 1. bit wegfällt)
    
            if(bytes[i] & 128 == 0) // erstes bit ungesetzt
                break;
        }
        return result;
    }
    

    So sollte das gehen (ungetestet), aber bist du sicher dass die Kodierung so stimmt ?
    Oder hab ich da was falsch verstanden ?



  • Ich danke dir, es funktioniert PRIMA! 😃 👍 👍 👍


Log in to reply