Konvertierung double <> platf.unabh. Binärformat



  • Hi,

    ich muss Doubles zum Transport übers Netzwerk in ein plattformunabhängiges Binärformat wandeln. Für int's etc ist das mit htonl und Konsorten ja garkein Problem. Was kann ich aber bei doubles machen?

    Meine jetzige Lösung ist, sie mit einem stringstream nach String zu wandeln, zuerst ein Längenbyte zu schicken und danach die einzelnen Zeichen des Strings. Allerdings stellt sich das als Flaschenhals der Anwendung heraus. (bitte keine Kommentare, dass das nicht ganz richtig ist, das weiß ich 🙂 (Unterschied . , auf dt. und engl. Systemen))

    Kennt jemand eine Lösung, die unter jedem OS funktioniert? D.h. egal ob 32- oder 64 Bit und egal ob Little- oder Big-Endian. Die Kombinationen treten leider alle auf.

    Gruß



  • Mir würde einfallen, zu Beginn jedes Datenblocks eine Information zur Codierung mitzuschicken (Endian, sizeof, etc.).



  • Naja das Problem ist:
    Definiert der Standard den Aufbau eines Doubles im Speicher? Ich meine nicht, lasse mich aber gern eines besseren belehren. Wenn es immer 64 Bit wären, wäre ja "nur" noch die Endianess ein Problem.

    Informationen über Endianess und Size mitzuschicken will ich nicht, da ich die Plattformabhängigkeit ja implizit wieder mit einbaue und alle Clients beim Hinzukommen einer neuen Plattform erweitern und anschließend austauschen müsste.

    Könnte evtl. das Arbeiten mit scanf und printf signifikant schneller sein, als mit stringstreams? Auf 2-3% Zuwachs kommt es nicht an - die Umwandlung frisst momentan 95% der Zeit.



  • nachdem du ja den quelltext für jede plattform etwas anpassen kannst (z.b. per define) würde ich schlicht und ergreifend den double wert raw im little endian übertragen (oder andersrum. nur festlege nmusst du dich) und entsprechend die sende und empfangsfunktionen so anpassen, dass jeweils bei bedarf eine umwandlung gemacht wird. d.h. auf little endian einfach senden und empfangen, auf big endian beim senden umwandlung in little endian und empfangen umwandeln von little in big. diese umwandlung solte relativ schnell machbar sein.



  • Das Problem beim Double ist ja, wieviele und welche Bits benutzen Mantisse und Exponent und wo finde ich das Vorzeichen?

    Was sagt der Standard hierzu? Hält er sich an irgendeine IEEE-Norm? Weiß jemand, wie das dann aussehen würde? Oder ist der Aufbau von Doubles immer Prozesser/Compilerabhängig? (sprich: nicht festgelegt)



  • double ist glab ich festgeschrieben (standard). erweiterungen (long double o.ä.) sind dann wahrscheinlich compilerabhängig. aber man kann das für jeden compiler rausfinden und dann entsprechende defines setzen, dass dann die richtige anweisung genommen wird

    plattformunabhängig muss nicht heissen: 1:1 auf jeder plattform einsetzbar. sowas kann eben auch durch defines geregelt werden


Anmelden zum Antworten