Type casting von Byte-Puffer zu long-Wert

OP #628957
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
In welcher Reihenfolge sind die Bytes denn abgelegt? Wenn das High-Byte 
zuerst kommt, dann könnte das funktionieren:
1
unsigned long wert;
2
for(char i = 3; i < 7; i++)
3
{
4
    wert <<= 8;
5
    wert += buffer[i];
6
}
Andernfalls die Zählrichtung umkehren.
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
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
> 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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.