Gast
#2619016
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.
|
Anzeige
|
C Bitoperation: 32 zu 4*8
Gast
#2619016
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. union aus uint32_t und uint8_t[4]. beim Füllen "htonl" verwenden. 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".
Gast
#2619220
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.
Gast
#2619237
Schieben und maskieren.
Gast
#2619268
Ε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.
Gast
#2619526
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.
Gast
#2619588
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 ;)
Gast
#2620363
Also, die "sauberste" Methode ist tatsächlich der böse Pionter-Cast? 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. >
Gast
#2621205
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. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|