Ich habe kürzlich an einem System gearbeitet, das große Datenmengen speichern und laden muss, einschließlich Gleitkommawerte mit einfacher Genauigkeit. Ich entschied mich für Netzwerk-Byte-Reihenfolge für ganze Zahlen zu standardisieren, und beschlossen, auch Punktwerte im Big-Endian-Format zu speichern, schwimmend, dh:Portable Serialisierung von Gleitkommawerten nach IEEE754
|-- Byte 0 --| |-- Byte 1 -| Byte 2 Byte 3
# ####### # ####### ######## ########
Sign Exponent Mantissa
1b 8b, MSB first 23b, MSB first
Idealerweise möchte ich Funktionen bieten wie htonl()
und ntohl()
, da habe ich schon Ich benutze diese für das Abtupfen von Ganzzahlen, und ich möchte dies auch auf eine Weise implementieren, die so plattformunabhängig wie möglich ist (unter der Annahme, dass der Typ float
IEEE754 32-Bit Fließkommawerten entspricht). Gibt es einen Weg, möglicherweise mit ieee754.h
, um dies zu tun?
Ich habe eine Antwort, dass scheint zu funktionieren, und ich werde es unten schreiben, aber es scheint ziemlich langsam und ineffizient, und ich würde irgendwelche Vorschläge zu schätzen weiß, wie es schneller zu machen und/oder zuverlässiger.
Was ist damit: http://stackoverflow.com/a/2782742/1327576? – smocking
Ich schaute auf diese Antwort und es hängt eindeutig von der Annahme ab, dass die Host-Repräsentation Little-Endian ist. Ich suche nach etwas, das Host-Byte-Order-Agnostic ist. –
Wahrscheinlich 'snprintf (b, sizeof (b),"% .9001f ", yourvalue)' (textbasierte Darstellung) ist am tragbarsten. –