www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Zuweisung von u32Bit Wert an u8Bit Wert


Autor: Sebastian Sobierajski (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab hier ein Problem bei der Typumwandlung.
Es geht um folgendes.

Ich hab ein Wert der in einer Variablen des Typs UINT32 (unsigned long
32 bit)abgespeichert ist.
Diesen muss ich über Ethernet verschicken.
Der Ethernetpuffer ist aber vom Typ UINT8 (unsigned 8-bit).
Jetzt wollte ich den 32Bit Wert casten um diesen so an ein UINT8 Buffer
zu übergeben.
Hat einer eine Idee wie man diesen Wert in diesen Puffer schreiben
kann.

Beispiel Werte für 32Bit Wert : 4600
Ich kann aber nur im unsigned char (allso UINT8) Wert max. 255
eingeben.
Das ich die 4600 aufteilen muss ist mir klar. aber WIE ???

Danke für jede Art von Hilfe

Autor: Bri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UINT8 puffer[4];
UIINT32 wert;

puffer[0] = (UINT8)(wert >> 24);
puffer[1] = (UINT8)(wert >> 16);
puffer[2] = (UINT8)(wert >> 8);
puffer[3] = (UINT8)wert;

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

es gibt dafür zig Varianten. Hier mal ein paar

1.
net_buf[i++] = *(((UINT8 *)(&longvar))+0);
net_buf[i++] = *(((UINT8 *)(&longvar))+1);
net_buf[i++] = *(((UINT8 *)(&longvar))+2);
net_buf[i++] = *(((UINT8 *)(&longvar))+3);

2.
net_buf[i++] = ((UINT8 *)(&longvar))[0];
net_buf[i++] = ((UINT8 *)(&longvar))[1];
net_buf[i++] = ((UINT8 *)(&longvar))[2];
net_buf[i++] = ((UINT8 *)(&longvar))[3];

3.
net_buf[i++] = (longvar>>0)  & 0xFF;
net_buf[i++] = (longvar>>8)  & 0xFF;
net_buf[i++] = (longvar>>16) & 0xFF;
net_buf[i++] = (longvar>>24) & 0xFF;

4.
net_buf[i++] = (longvar)  & 0xFF;
net_buf[i++] = (longvar/256)  & 0xFF;
net_buf[i++] = (longvar/(256*256)) & 0xFF;
net_buf[i++] = (longvar/(256*256*256)) & 0xFF;

5.
memcpy(net_buf,&longvar,4);

Es gibt da noch diverse Möglichkeiten (z.B. unter zuhilfenahme von
union's) aber das sollte fürs erste reichen.

Matthias

Autor: Bri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es gänge aber auch so:

UINT8 puffer[4];
UINT32 wert, *p = (UINT32 *)puffer;

*p = wert;

Die Bytereihenfolge hängt dann aber vom Prozessor und/oder Compiler ab!
Deshalb solltest du besser die erste Variante nehmen.

Autor: Sebastian Sobierajski (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Als erstes Danke für die schnelle Hilfe.
Dieses Forum ist echt spitze :-)

Ich hab das Problem so gelöst hab mir etwas von meine IP Stack
abgeschaut
Ich schifte die Bits :-)
Das klappt auch wunderbar.

Aber  jetzt hab ich das Problem den empfangenen Buffer auf der PC Seite
wieder umzuwandeln....
Big Endian (Motorola) versus Little Endian (Intel)....

Bei Motorolla werden die Daten fogendermassen dargestellt:
0xA1B2C3D4 = Motorolla Darstellung der Daten
auf dem Intel bzw. bei mir AMD soll es so aussehen
0xD4C3B2A1...

Ich verzweifle beim Port der ist Dezimal 5000 das entspricht 0x1388
Diese 0x1388 teile ich in den unsigned Buffer auf also einmal 13 und
88
Auf der PC Seite will ich diese jetzt wieder zum INT zusammen
packen...
Aber es kommt nur Mist raus.

Hat einer Ahnung was ich falsch machen

Danke für jede Art von Hilfe...
Sibi

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Such mal in der Socket-Doku nach den Funktionen htonl/ntohl.

Autor: Bri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also erstmal solltest du probieren, ob eine von den beiden Varianten
beim zusammenbauen geht:

UINT32 w;
UINT8 puffer[4];

w = (puffer[0] << 24) | (puffer[1] << 16) | (puffer[2] << 8) |
(puffer[3])

oder

w = (puffer[3] << 24) | (puffer[2] << 16) | (puffer[1] << 8) |
(puffer[0])

Wenn w nur den Wert des letzten Wertes aus dem Puffer hat (also
puffer[3] oder puffer[0]) dann bedeutet das, das der Compiler beim
shiften UINT8 verwendet und die bits sozusagen "rausrutschen". Du
musst dann die Werte im Puffer erst in UINT32 wandeln:

w = ((UINT32)(puffer[0]) << 24) | ((UINT32)(puffer[1]) << 16) |
((UINT32)(puffer[2]) << 8) | (puffer[3])

oder

w = ((UINT32)(puffer[3]) << 24) | ((UINT32)(puffer[2]) << 16) |
((UINT32)(puffer[1]) << 8) | (puffer[0])

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.