char Array als Struktur interpretieren

Gast #1599028
Lesenswert?

Hallo,

ich empfange Kommando-Datenpakete(kein einheitliches Format) über die 
serielle Schnittstelle und speicher diese erstmal in einem char Buffer 
ab.

Ich wollte nun verschiedene structs definieren, und den Buffer je nach 
Datenpaket als einen dieser Structs interpretieren um die Daten 
einfacher verarbeiten zu können und nicht per Indizies auf den Buffer 
zugreifen zu müssen.

Ich weiß aber nun nicht genau, wie ich das anstelle, das ich den Buffer 
als struct interpretieren kann. Muss ich den buffer zu einem struct 
casten?

Irgendwie finde ich bei google kein leicht verständliches Beispiel bzw. 
fehlt mir irgendwie das Stichwort dafür.

Gehen sollte das doch aber irgendwie, oder?
#1599037
Lesenswert?

honkytonky schrieb:

> Ich weiß aber nun nicht genau, wie ich das anstelle, das ich den Buffer
> als struct interpretieren kann. Muss ich den buffer zu einem struct
> casten?

Fast. Du castest dir einen Pointer auf den Anfang des Buffers um zu 
einem Pointer auf die Struktur.
1
struct irgendwas
2
{
3
  int member1;
4
  int member2;
5
};
6

7
int main()
8
{
9
  char buffer[20];
10
  struct irgendwas* pStruct;
11

12
  .... buffer kriegt seinen Wert
13

14
  pStruct = (struct irgendwas*)buffer;
15

16
  mach was mit pStruct->member1;
17
  mach was mit pStruct->member2;
Gast #1599762
Lesenswert?

Noch eine Anmerkung:

sowas funktioniert nur zuverlässig auf 8 Bit CPUs (was hier 
wahrscheinlich aber gegeben ist).

Bei > 8 Bit fügt der Compiler u.U. zusätzliche Bytes in die Struktur 
ein, Stichtwort: Alignment.
Je nachdem, was man dem Compiler beim Erstellen dazu mitteilt bzw. zu 
was man ihn auffordert.
Gast #1599777
Lesenswert?

Zur Anmerkung:

honkytonky schrieb:
> ich empfange Kommando-Datenpakete(kein einheitliches Format) über die
> serielle Schnittstelle und speicher diese erstmal in einem char Buffer
> ab.

In dem Fall ist die Spielerei mit den Strukturen sowieso eine blöde 
Idee, da zwei Maschinen mit u.U. verschiedenen Endiannesses im Spiel 
sind.
Gast #1599856
Lesenswert?

öh...Endiannesses?  little endian, big endian oder wie? hmmm...ne, ich 
glaube nicht das ich davon betroffen bin

ja, es handelt sich um eine 8bit CPU und was für Möglichkeiten habe ich 
denn sonst, so eine Datenpaket möglichst geschickt zu parsen??
Die ganze Zeit mit den Buffer-Indizies zu arbeiten ist sehr 
unübersichtlich. Da ist ein bischen Klartext schon hilfreicher.

Und bisher funktioniert das nach der von Karl-Heinz geposteten Methode.

Falls jemand was besseres weiß dann nur her damit. Mich verwirrt diese 
Poiterei nämlich immer recht schnell :(
Gast #1599871
Lesenswert?

Naja, dein Problem ist recht simpel. In der Netzwerktechnik gibt es 
genau deshalb z.B. die Funktionen htons/ntohs usw.

Beispiel:
Du überträgst den Datenstrom zeichen(byte)weise ein. Nun hast du vom 
Sender einen vier Bytes breiten Integer (zwei Bytes reichen natürlich 
auch schon). Der Sender geht hin und überträgt die vier Bytes der Reihe 
nach, von der ersten bis zur vierten Speicherstelle.

Der Empfänger geht nun hin und liest die vier Bytes der Reihe nach und 
schreibt sie hintereinander in die vier Speicherstellen eines Integers.

Was passiert nun, wenn beim Sender die erste Speicherstelle das Byte mit 
den Stellen 0 bis 7 war, beim Empfänger aber das Byte mit den Stellen 
24..31?
Gast #1600532
Lesenswert?

Bei einer 8 Bit CPU ists ja wurscht, ich wollte nur darauf hinweisen.

Weil im Ursprungspost steht nichts von der Zielplattform.


Ich gehe mal davon aus, dass Du Byte-für-Byte über die Leitung schickst, 
und genau weisst, welches Byte wie zu verarbeiten und von welchem 
Datentyp ist.
Ansonsten solltest Du dir natürlich dann nochmal Gedanken zur 
HW-Architektur der Senderseite etc. machen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren