host-zu-Netz doppelt?
Ich würde gerne einige double-precision-floating-point-zahlen über das Netzwerk. (standard C, standard-buchsen) Es gibt keine htond oder ntohd konvertieren der Daten in und aus der Netzwerk-byte-Reihenfolge. Was soll ich tun? Ich habe ein paar Lösungen in meinem Kopf, aber ich würde gerne wissen, was die gängige Praxis ist.
(Ich würde auch gerne wissen, was ist die gängige Praxis, zum versenden 64bit ints, wie gint64 Werten, die von gstreamer)
Bearbeiten:
Dies ist eine Lösung, die ich dachte. Ich vermute, es funktioniert für beliebig große ganze zahlen, aber ist es richtig für Doppel?
void swap_if_necessary (void* buff, int buff_len)
{
uint32_t foo = 1;
if ( htonl(foo) != foo )
{
char* to_swap = (char*)buff;
int i;
for (i = 0; i < buff_len/2; i++)
{
char swap_buff = to_swap[i];
to_swap[i] = to_swap[buff_len -1 -i];
to_swap[buff_len -1 -i] = swap_buff;
}
}
}
- Dieser Abschnitt auf Wikipedia erklärt die Lage gut.
- Würden Sie nicht einfach senden Sie die 64-bit integer big-endian-wie alle anderen ganzen zahlen? Wie wäre das anders als die anderen ganzen zahlen?
- das problem ist, sollte ich es konvertieren zu big endian mich, oder gibt es da eine Bibliothek, die das tut für mich. Der standard-bsd-sockets, die nur Funktionen für die 32-und 16-bit-Integer.
- GCC bietet
__builtin_bswap64()
- siehe gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Andre sagt, ist, dass binary floating-point-zahlen, die nicht vertrauenswürdig sind über Netzwerke aufgrund der Unterschiede zwischen verschiedenen computer-Architekturen. Unterschiede, die jenseits der byte-Reihenfolge (big/little endian). So Dinge wie das konvertieren von strings oder die Verwendung von Bibliotheken wie XDR, ist wirklich notwendig, wenn es irgendeine chance, Ihre Daten verarbeitet werden von verschiedenen computer-Architekturen.
Den einfachen Formaten von Ganzzahlen und Zeichen können durchschlüpfen mit nur endian Anpassungen, sondern floating-point wird komplexer.
Konvertieren Sie es zu einem vereinbarten format-string und sendet. Nicht sicher, ob es üblich oder sogar anständig, aber bei mir hat es geklappt (es ist wahr, ich kümmerte sich nicht um die Leistung an diesem Punkt, da ich nicht senden sehr viele Werte).
strtod
. Wenn Sie möchten, senden eine Menge Daten und wollen Billig-Konvertierung (sound, Positionen in einer Echtzeit-3D-Spiel,...), betrachten Sie das senden von fixed point zahlen.sprintf(...,"%.*e", DBL_DECIMAL_DIG -1, x)
ausreichend zu sein, um eindeutig zu konvertierendouble
(außer NaN mit einer payload).sprintf(...,"%a", x)
ist auch gut.Vielleicht möchten Sie sich bei XDR, die zuerst definiert in rfc1014. Offensichtlich, Sie möchten, finden eine Bibliothek, die implementiert XDR für Ihre Plattform.