Forum: Mikrocontroller und Digitale Elektronik uint64 wert in uint8 array


von Marcell (Gast)


Lesenswert?

Hallo,
ich habe mal eine Frage.
ich habe eine Variable in uint64. Diese möchte ich gerne in einen 8 byte 
langen Array uint8 packen.
z.B.
0x9e884dd9d83d8588
in
array[8] = {0x9e, 0x88, 0x4d, 0xd9, 0xd8, 0x3d, 0x85, 0x88}

momentan mache ich es in einer for-schleife
1
    for(uint8 x=0; x<8; x++)
2
    {
3
        transformedValue[x] = (uint8)((value>> (56 - 8*x))& 0xFF);
4
    }

gibt es da einen anderen weg? ohne schleife? (und ohne alle elemente 
untereinander zu schreiben?)

eigentlich ist doch transformedValue das gleiche wie value, nur anders 
dargestellt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Union?
1
union u64 {
2
  uint8_t bytes[8];
3
  uint64_t word;
4
};
5
6
union u64 u;
7
8
   u.word = 1234567890ull;
9
   for (int i = 0; i < 8; i++)
10
      putchar((int)u.bytes[i]);

Nachteil: die Anordnung der Bytes im 64-bit-Wort ist maschinenabhängig.

: Bearbeitet durch Moderator
von Bernd K. (prof7bit)


Lesenswert?

Auf einem Little endian Prozessor kommst Du nicht umhin erstmal die 
Endianness umzudrehen um es in Big-Endian-Format ins Array zu schreiben, 
also direkt auf einen Rutsch geht schonmal nicht.

von Bernd K. (prof7bit)


Lesenswert?

Jörg W. schrieb:
> union u64 {
>   uint8_t bytes[8];
>   uint64_t word;
> };

Sein Beispiel ist aber Big-Endian. Es müsste schon mit dem Teufel 
zugehen wenn OP zufällig noch einen Big-Endian-Prozessor ausgegraben hat 
um ihn für seine Programmierübungen zu benutzen.

von Marcell (Gast)


Lesenswert?

Bernd K. schrieb:
> Auf einem Little endian Prozessor kommst Du nicht umhin erstmal die
> Endianness umzudrehen um es in Big-Endian-Format ins Array zu schreiben,
> also direkt auf einen Rutsch geht schonmal nicht.

schade.
Hatte es auch mit memcpy probiert
1
memcpy(transformedValue, &value, sizeof(value));

dann war transformedValue aber verdreht.

Dann belasse ich es bei der schleife

von Bernd K. (prof7bit)


Lesenswert?

Marcell schrieb:
> Dann belasse ich es bei der schleife

das & 0xff am Ende kannst Du weglassen, das geschieht implizit beim 
Zuweisen zu einer 8-bit Variablen.

Du könntest das Array auch von hinten her auffüllen und value einfach in 
jeder Iteration um 8 nach rechts schieben, dann sparst Du Dir die 
Rechnerei um die shiftweite zu ermitteln.

von Falk B. (falk)


Lesenswert?

Marcell schrieb:
> Dann belasse ich es bei der schleife

Du hast es nicht verstanden. Bei der Verwendung einer Union muss rein 
gar nicht kopiert werden! Es wird auch nicht der doppelte Speicherplatz 
benötigt. Es reicht, richtig auf den 64 Bit Wert bzw. die Einzelbytes 
zuzugreifen.

von Bernd K. (prof7bit)


Lesenswert?

Falk B. schrieb:
> Du hast es nicht verstanden.

Du hast es auch nicht verstanden: Er braucht das Array in Big-Endian!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bernd K. schrieb:
> Sein Beispiel ist aber Big-Endian.

Gut, wenn er das unbedingt so braucht, muss er in den sauren Apfel 
beißen und die Werte irgendwie rumdrehen.

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
Noch kein Account? Hier anmelden.