hallo, ich habe eine Uint32 Variable. Wie kann ich die aufteilen in ein Uint8 Array[4] ? Also, es soll in Array[0] das höchstwertige Bit stehen und in Array[3] das minderwertigste.
Kommt darauf an ob der verwendete Rechner/Prozessor "big endian" oder "low endian" ist.
>> beim Füllen "htonl" verwenden. > Kommt darauf an ob der verwendete Rechner/Prozessor "big endian" oder > "low endian" ist. Nicht, wenn man htonl() verwendet. Das soll die "network byte order" herstellen, d.h. "big endian" wie es der OP haben will. Außerdem heisst das Gegenteil "little endian".
och, das läuft auf einem µC; ich würde es lieber per Hand machen. Ob Big- oder Little Ending kann ich ja schnell ausprobieren.
Schieben und maskieren.
1 | Array[0] = (Variable >> 24) & 0xff; |
2 | Array[1] = (Variable >> 16) & 0xff; |
3 | Array[2] = (Variable >> 8) & 0xff; |
4 | Array[3] = (Variable ) & 0xff; |
Εrnst B✶ schrieb: > union aus uint32_t und uint8_t[4]. Das ist abgesehen davon, daß es in C eigentlich verboten ist, auch recht umständlich. Da würde ich lieber einen Pointer-Cast machen. DirkB schrieb: > Schieben und maskieren. Das ist auch endian-unabhängig, wird aber vom Compiler auf manchen µCs nicht optimal umgesetzt.
Rolf Magnus schrieb: > Das ist abgesehen davon, daß es in C eigentlich verboten ist, auch recht > umständlich. In MISRA-C ist es vielleicht verboten aber warum soll das in C89 und/oder C99 verboten sein? Rolf Magnus schrieb: > Da würde ich lieber einen Pointer-Cast machen. Ack
Honkihonkohonkahu schrieb: > In MISRA-C ist es vielleicht verboten aber warum soll das in C89 > und/oder C99 verboten sein? Weil der C-Standard eigentlich ausdrücklich sagt, dass man aus einer Union nur denjenigen Member lesen darf, der auch als letztes beschrieben wurde.
Stefan Ernst schrieb: > Weil der C-Standard eigentlich ausdrücklich sagt, dass man aus einer > Union nur denjenigen Member lesen darf, der auch als letztes beschrieben > wurde. Ergibt Sinn, ich sollte wohl um diese Uhrzeit wohl nicht zu allem meinen Senf dazu geben ;)
Das ist die sauberste Methode, weil man damit genau sagt, welches Byte wo hin soll. Durch Pointerbastelei oder Unionbastelei kann man unterschiedliche Ergebnisse, je nach Compiler, Plattform, etc bekommen. DirkB schrieb: > Schieben und maskieren. >
1 | > Array[0] = (Variable >> 24) & 0xff; |
2 | > Array[1] = (Variable >> 16) & 0xff; |
3 | > Array[2] = (Variable >> 8) & 0xff; |
4 | > Array[3] = (Variable ) & 0xff; |
5 | >
|
Wenn die CPU keinen Barrel-Shifter hat, kann man ja auch mit einer Hilfsvariablen arbeiten und die dann jeweils 8 Stellen verschiebt.
DirkB schrieb: > Wenn die CPU keinen Barrel-Shifter hat, kann man ja auch mit einer > Hilfsvariablen arbeiten und die dann jeweils 8 Stellen verschiebt das wird der compiler wohl von alleine optimieren. Ich könnte wetten, dass im Assembly kein einzige(r) Shift oder Maskierung enthalten ist.
DirkB schrieb: > Wenn die CPU keinen Barrel-Shifter hat, kann man ja auch mit einer > Hilfsvariablen arbeiten und die dann jeweils 8 Stellen verschiebt. Unsinn. Dieser C-Code wird in 99.9% aller Fälle in 0 Extra-Instruktionen umgesetzt. Gleichzeitig hat man sauber definiert, was wo landen soll. Also -> saubere Lösung.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.