Type casting von Byte-Puffer zu long-Wert

OP #628957
Lesenswert?
• ▲
▼
Hallo zusammen

Ich verwende gcc und möchte Daten, welche in einem Byte orientierten 
Puffer gespeichert sind als long-werte interpretieren und einer Routine 
übergeben.

Wie würdet ihr diese bitte effizient gestalten?

Im nachfolgenden Beispiel enthält Puffer ab der Stelle 3 eine 
long-Variable, welche ich der Routine myProcedure übergeben möchte.
1
unsigned char buffer[40];
2

3
void myProcedure(long value)
4
{
5
  do someting with value
6
}
7

8
myProcedure((long)&buffer[3]); // funktioniert nicht:(

Bestimmt ist für die Sprache c hier etwas vorgesehen:)

Beste Grüsse

Geri
#628976
Lesenswert?
• ▲
▼
Ich würde einen struct definieren, der die Struktur des Pufferinhaltes 
beschreibt - das ist wesentlich übersichtlicher und besser pflegbar:

typdef struct _bufdesc {
   long   V1;
   long   Value;
   ...
} bufdesc;

bufdesc *pBufDesc = (bufdesc *) buffer;
myProcedure(pBufDesc->Value);
OP #629053
Lesenswert?
• ▲
▼
Hallo zusammen

Vielen Dank für Euer rasches Feedback!

Die Version von Marius scheint für mich aktuell passend, weil meine zu 
entwirrende Datenströme sehr unterschiedlich sind.

Uhu Uhuhu
Deine Version ist bestimmt auch sehr elegant - und eben wesser wartbar.


Johannes deine Version dünkt mich - gleich wie meine Variante - eben 
ineffizient.

Eine funktionierene aber eben nicht effiziente Varinate sieht so aus:
1
int32_t GetLongVal(byte* buffer)
2
{
3
  int32_t Value;
4

5
  memcpy(&Value, buffer, sizeof(Value)); //sizeof(Value));
6
  return Value;
7
}

Beste Grüsse

Geri
#629089
Lesenswert?
• ▲
▼
> Die Version von Marius scheint für mich aktuell passend, weil meine zu
> entwirrende Datenströme sehr unterschiedlich sind.

Du solltest dir dann für jeden Datentyp, der im Puffer stehen kann, 
einen struct definieren.

Ist zwar ein bischen Arbeit, aber macht das ganze Zeug deutlich 
übersichtlicher, als wenn du wild rumcastest.

Meine Erfahrung sagt mir: Typecasts sollte man meiden, wo immer 
möglich...

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.