Forum: Compiler & IDEs Von char Buffer auf ein uint32 ?


von AVRli (Gast)


Lesenswert?

Hallo,

wie bekommt man einen uint32 Wert aus einem Char Buffer wieder in eine 
uint32 Variable?

versuche ergeben immer 0. :-(


char buf[128];
uint32_t uint32val;

uint32val = (uint32_t)(*buf);


*buf steht auf der Adresse wo der uint32 Wert abgelegt wurde.

Danke für jeden Hinweis...

von Peter II (Gast)


Lesenswert?

1
uint32_t x = (uint32_t)buf[0]<<24 | (uint32_t)buf[1]<<16 | buf[2]<<8 | buf
2
3
//oder
4
uint32_t x;
5
memcpy( &x, buf, 4 );
wobei das memcpy den Nachteil von litte/big endian hat.

von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> uint32_t x = (uint32_t)buf[0]<<24 | (uint32_t)buf[1]<<16 | buf[2]<<8 |
> buf

Das funktioniert aber auch nur dann richtig, wenn char vorzeichenlos 
ist, was wiederum von Compiler und Zielplattform abhängt. Die Frage ist 
aber eh, warum das in einem Array aus char steht. Es ist kein Text, also 
ist char der falsche Typ.

von AVRli (Gast)


Lesenswert?

Hi,

es ist ein Datenpaket welches an der Stelle eine Zahl enthält die 
wiederum in uint32 gespeichert wurde. Wie weiß ich nicht, das kommt so 
aus dem Gerät.

Ein Beispiel habe ich aber.

00 0d 2f 00

entspricht wohl

864000

Ich dachte es würde mit einem Cast gehen die Byte Verschiebung und Oder 
Verknüpfung hatte ich nicht dran gedacht. Ich versuche es mal.

Danke!

von Bernd K. (prof7bit)


Lesenswert?

AVRli schrieb:
> uint32val = (uint32_t)(*buf);

Das geht natürlich nicht denn das da:
1
(*buf)

ist gleichbedeutend mit dem da:
1
buf[0]

also du nimmst nur das erste Element des char arrays (was zufällig 0 ist 
in Deinem Beispiel) und castest das dann nach uint32_t und dann ist es 
natürlich immer noch 0.

Versuchs mal so:
1
uint32_t* p = (uint32_t*)buf;
2
uint32val = p[0];

ABER das ist schmutzig und böse und überhaupt nicht portabel, es wird 
nur gehen wenn die Endianness zufällig stimmt, ansonsten würd ich 
einfach die 4 bytes wie von Peter beschrieben explizit in der richtigen 
Reihenfolge zusammensetzen.

Edit: sehe gerade daß es wahrscheinlich nicht mit dem einfachen 
Pointer-Cast gehen wird (d.H. der Cast wird schon gehen, nur das 
Ergebnis wird falsch sein) denn die von Dir gepostete 
Beispiel-Zahlenfolge ist Big-Endian und Dein Prozessor ist 
wahrscheinlich Little-Endian.

: Bearbeitet durch User
von Hans (Gast)


Lesenswert?

Bernd K. schrieb:
> Versuchs mal so:
> uint32_t* p = (uint32_t*)buf;
> uint32val = p[0];

Geht auch einen Tick kürzer:
1
uint32val = *((uint32_t*) buf)

von Bernd K. (prof7bit)


Lesenswert?

Hans schrieb:
> Geht auch einen Tick kürzer:uint32val = *((uint32_t*) buf)

Ja, das stimmt. Ich habs auseinandergezogen weil gcc gemeckert hat wegen 
der strict aliasing rules ;-)

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.