Forum: Compiler & IDEs Type casting von Byte-Puffer zu long-Wert


von G. B. (geri)


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

von Marius (Gast)


Lesenswert?

Hallo
Du musst den Pointer noch dereferenzieren:
1
myProcedure(*((long*)&buffer[3]));
MfG Marius

von Johannes M. (johnny-m)


Lesenswert?

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.

von Uhu U. (uhu)


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);

von G. B. (geri)


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

von Uhu U. (uhu)


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...

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
Noch kein Account? Hier anmelden.