C: Åtkomst av (5,6,7)-bitars värden i array

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

C: Åtkomst av (5,6,7)-bitars värden i array

Inlägg av Zkronk »

Hej!

Jag undrar om det finns något bra sätt att komma åt dom olika sektionerna i ett datapaket när sektioner är uppdelade över två olika bytes?
Jag har gjort ett misslyckat försök med en union innehållande en struct och bitfälts-variabler med olika bredd, det blev väldigt konstiga värden då.
Första fältet (cmd) är 6 bitar brett, sen 5 bitar (func) och resterande är 7 bitar breda.
Det som jag gjort här nedan fungerar, men frågan är om det går att göra på något bättre sätt?

Kod: Markera allt

#include <stdint.h>

uint8_t frame[4] = {0x94, 0x59, 0x28, 0x40};

//    [0]         [1]         [2]         [3]
// 1001 0100   0101 1001   0010 1000   0100 0000                                       
// |     ||      ||         ||         ||      |                                       
//   Cmd    Func      Blue      Green     Red                                          
//   0x25   0x02      0x64      0x50      0x40

int main(void)
{
    uint8_t cmd = frame[0] >> 2;
    uint8_t func = ((frame[0] & 0x03) << 3) | (frame[1] >> 5);
    uint8_t blue = ((frame[1] & 0x1f) << 2) | (frame[2] >> 6);
    uint8_t green = ((frame[2] & 0x3f) << 1) | (frame[3] >> 7);
    uint8_t red = frame[3] & 0x7f;

    return 0;
}
Användarvisningsbild
bit96
Inlägg: 2492
Blev medlem: 3 september 2007, 10:04:29
Ort: Säffle

Re: C: Åtkomst av (5,6,7)-bitars värden i array

Inlägg av bit96 »

Utan att lusläsa ditt program så ser det bra ut, gott om parenteser, och egen kontroll ner på bit-nivå.

Dock saknas kommentarer för varje rad så att man exakt vet vad som händer.
Det blir svårläst i ett senare skede när man skall förstå hur man tänkte då.

Så som du gjort är enligt min erfarenhet det bästa och säkraste sättet att veta exakt vad som händer.
Att hålla på med unioner, structer, bitfält m.m. och överlåta till nån okänd kompilator-programmerare att bestämma hur resultatet skall bli är normalt ingen bra metod.

Så, lägg till kommentarer så är din lösning den bästa, säkraste, enklaste och lättaste att förstå.

Och du fick ju ett exempel från din andra tråd med bitshift-frågan hur en till synes enkel operation inte blir som du tänkt.
När man bitmanipulerar gäller full egenkontroll.
Zkronk
Inlägg: 1423
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: C: Åtkomst av (5,6,7)-bitars värden i array

Inlägg av Zkronk »

Tack för svar!

Då ska jag se till att ordna bra kommentarer som förklarar vad som händer, så att både en själv och andra slipper klia sig i huvudet i framtiden :)
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: C: Åtkomst av (5,6,7)-bitars värden i array

Inlägg av baron3d »

Om du kör programmet i en 32-bits processor är det mer effektivt om alla byten ligger i en 32-bits variabel.
Kör du med en 8-bitare är det svårt att göra effektivare.
Skriv svar