Extrahieren Sie Daten von uint8 nach double
-
12-12-2019 - |
Frage
Ich habe eine C-Funktion, die a empfängt uint8
zeiger mit einem anderen Parameter, der seine Größe (Anzahl der Bytes) ist.
Ich möchte extrahieren double
daten aus diesem Puffer.Hier ist mein Code:
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
for (i = 0; i < size; i++)
{
d = ((double*)&data)[i];
printf(" d = %d\n");
}
}
Das Problem ist, dass ich das, was ich sende, nicht innerhalb einer externen Hardware empfange.Ich denke, dass meine Besetzung falsch ist.Ich habe andere Methoden ausprobiert, aber ohne gutes Ergebnis.Ich kann immer noch nicht bekommen, was ich sende.
Lösung
Wenn ich deine Frage verstehe (es ist nicht ganz klar, ob es höchstens eine gibt double
extrahieren oder es kann viele geben), hier ist, was ich versuchen würde:
double Write(uint8* data, uint8 size)
{
double d;
if (size < sizeof(d))
return 0; // failure; you may want something smarter than this
memcpy(&d, data, sizeof(d));
return d;
}
Was dies vermeidet, ist ein potenzielles Ausrichtungsproblem in einer Besetzung wie d = *(double*)data
.
Dies kann auf seltsame und hässliche Weise fehlschlagen, wenn die Daten keine gültige double
, insbesondere wenn es umgekehrt ist (z.ihre Hardware ist Little-Endian und die CPU, auf der dieser Code ausgeführt wird, ist Big-Endian oder umgekehrt).
Ich weiß noch nicht, ob Aliasing-Probleme zutreffen.Ich muss den Standard noch einmal lesen.In der Praxis habe ich sie jedoch nie gesehen.
Andere Tipps
Angenommen, Ihre Daten sind tatsächlich ein Array von Doppelwerten und die Größe ist die Anzahl der Bytes, sollte Ihr Code ungefähr so aussehen:
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
int i;
for (i=0; i<size/sizeof(double); ++i) {
d = ((double*)data)[i];
printf(" d = %g\n",d);
}
}
Höchstwahrscheinlich ist die Größe die Anzahl der Bytes und nicht die Anzahl der Doppel, daher müssen Sie die Größe durch die Größe eines Doppel teilen, um die tatsächliche Anzahl der Doppel zu erhalten:
Wenn du das tust:
d = ((double*)&data)[i];
dann sagen Sie, dass der Zeiger auf den Zeiger auf die Daten ein Doppelzeiger ist.
Auch Ihre printf-Anweisung war so:
printf(" d = %d\n");
Sie haben ihm gesagt, dass er ein int drucken soll (% d ist ein int) und ihm keinen tatsächlichen Wert zum Drucken geben soll.Ich habe das in% g geändert, wodurch ein Double im Best-Fit-Format gedruckt wird.
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
for (i=0; i<size; i++) {
d = ((double*)data)[i];
printf(" d = %d\n", d);
}
}
ist es das, wonach ich vermute, dass Sie suchen, der Zeiger ist eigentlich ein Zeiger auf ein Array von Doubles, also werfen Sie ihn einfach genau darauf um