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...
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.
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.
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!
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
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) |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.