Hallo Ich arbeite an Socket-Übersetzung zwischen zwei Protokollen. Ich lese aus einer Binärdatei und speichere den geparsten Header in einem Array vom Typ uint32_t. Dann nehme ich die Felder aus dem Array und wandle sie in entsprechende Typen um. Bisher funktioniert uint32_t
/int32_t
/uint16_t
bis int32_t
funktioniert gut.C - kombiniere zwei uint32_t zu einem Doppel
Allerdings bekomme ich alle Arten von falschen Ausgaben beim Versuch, zwei Uint32_t (nacheinander anhängen) und dann konvertieren diese 64-Bit-lange Daten in ein Doppel.
Als Neuling zu C-Programmierung habe ich Probleme mit der Computer-Methodik von double
/float
Darstellung.
Im Grunde, was ich will, ist zu tun: ohne das Bitmuster der beiden zu verändern uint32_t
,
Concast
verketten nacheinander eine 64-Bit-Daten zu machen, wandeln dann die Daten als double
. Das Wichtigste ist, das Bitmuster nicht zu ändern, da dieser Teil des Bitstroms ein double
sein soll.
Das folgende ist ein Teil des Codes:
uint32_t* buffer = (uint32_t*) malloc (arraySize * sizeof(uint32_t));
...
double outputSampleRate = ((union { double i; double outputSampleRate; })
{ .i = ((uint64_t)buffer[6] << 32 | (uint64_t)buffer[7])}).outputSampleRate;
Daten in Eingabedatei:
35.5
Wert nach meinem Code:
4630192998146113536.000000
, auch gibt es eine bessere Art und Weise die Socket-Header-Analyse zu behandeln?
"Ich bekomme alle Arten von falschen Ausgaben" -> Was war Ihre Eingabe, Ausgabe und erwartete Ausgabe. – chux
Nicht alle Bitmuster, die mit 2 'uint32_t' möglich sind, können zu einem gültigen/eindeutigen 'double' führen. Es hängt vom 'doppelten' Format und möglichen Nicht-Ein-Zahlen ab. – chux
"gibt es eine bessere Möglichkeit, die Socket-Header-Analyse zu behandeln?" Sende den Code, den du versucht hast, um gutes Feedback zu bekommen, sonst ist das einfach zu weit gefasst. – chux