Het stelt allemaal niet zo veel voor. Het enige dat je moet weten is wat de operators doen en hoe de bitjes in een byte zitten.
Als je een byte hebt en je wilt kijken wat de bit is op positie 5 (7 6
5 4 3 2 1 0) dan doe je dat zo:
Je begint bijvoorbeeld met 01
101001. Als je dit 5 plaatsen naar rechts schuift, dan staat het bitje dat je wilt hebben op positie 0 (0000001
1). Er staat nu nog wat troep bij de andere bitjes. Als je alleen bitje (op positie) 0 wilt overhouden, dan doe je & met 00000001. De 0-en in 00000001 zorgen ervoor dat de bitjes op die plaatsen 0 wordt (x And false is altijd false). De 1 in 00000001 zorgt ervoor dat je dat bitje overhoudt (x And true is altijd x).
In C ziet dit er zo uit:
C:
1
2
3
| data = 0x69;
temp = data >> 5;
bitje = tmp & 0x01; |
Als je de data en de positie variabel maakt dan kan je het bijvoorbeeld zo in een functie stoppen:
C:
1
2
3
4
5
6
| typedef unsigned char byte;
typedef unsigned char bit;
bit getbit(byte data, byte pos) {
return data >> pos & 1;
} |
Dat is dan al de eerste hulpfunctie waar ik het in mijn vorige bericht over had.
De tweede hulpfunctie waar ik het over had is een functie die van groepje bits bytes maakt.
Voorbeeld: "010", "1110", "10110", "1", "011" => "01011101", "01101011"
Om dit te doen heb je een globale variabele nodig waarin je de groepjes verzameld. Het beste kan je een variabele nemen van 16 bits (je kan dan eerst een nieuw groepje erbij doen voordat je een volle byte verstuurt). Ook moet je het aantal bits bijhouden in een globale variabele.
Wat je moet doen is:
Als er een nieuw groepje bijkomt, dan maak je ruimte in die 16 bits en zet je het nieuwe groepje bij de laagste positie.
en
Als het totaal aantal bits 8 of meer is, dan verstuur je een byte.
Het wordt dus zoiets:
C:
1
2
3
4
5
6
7
8
9
10
| unsigned remdata = 0;
byte remcount = 0;
void sendbits(byte data, byte count) {
/* stop data in remdata */
if (remcount >= 8) {
/* verstuur byte */
}
} |
Waar commentaar staat moet je zelf wat bedenken. Als je problemen hebt of als je niet zeker weet of je het goed hebt dan kan je dat in dit topic melden.
Veel succes...
Nb.
Vergeet ook niet een flush te maken voor als je klaar bent met je bitstuffing. Er kunnen namelijk nog bits in die remdata blijven staan.