2016-04-27 6 views
0

Wenn ich Netzwerkdaten zwischen Big und Little Endian umwandle, vergesse ich, dass wir alle Bytes austauschen, aus denen der Typ besteht. Unabhängig von der Größe des Typs tauschen wir sie so aus, dass das erste Byte das letzte Byte und das letzte Byte das erste Byte wird.
Dies kann allgemein mit der Funktion unten ausgedrückt werden:Wenn ein Double in Netzwerk-Byte-Reihenfolge, warum ist es in 4 Byte Chunks getan?

void SwapBytes(void *pv, size_t n) 
{ 
    char *p = pv; 
    size_t lo, hi; 
    for(lo=0, hi=n-1; hi>lo; lo++, hi--) 
    { 
     char tmp=p[lo]; 
     p[lo] = p[hi]; 
     p[hi] = tmp; 
    } 
} 

Ohne Sorge um die Effizienz,
Ich hatte gehofft, dies zu Daten arbeiten würde 754 verdoppelt type-- einschließlich IEEE.


Dann stieß ich auf die following post,
, wo der Benutzer die Bytes eines Doppel in 4-Byte-Blöcken ausgetauscht hat:

void send_double(double d) { 
    long int i64 = *((reinterpret_cast<int *>)(&d)); /* Ugly, but works */ 
    int hiword = htonl(static_cast<int>(i64 >> 32)); 
    send(hiword); 
    int loword = htonl(static_cast<int>(i64)); 
    send(loword); 
} 

double recv_double() { 
    int hiword = ntohl(recv_int()); 
    int loword = ntohl(recv_int()); 
    long int i64 = (((static_cast<long int>) hiword) << 32) | loword; 
    return *((reinterpret_cast<double *>(&i64)); 
} 

Gibt es eine spezielle Regel darüber, wenn es darum geht, Netzwerk-Byte-Reihenfolge?
Zuerst dachte ich, dass es um 4 Bytes zu einem Zeitpunkt, unabhängig von der Art zu tauschen, aber das wäre nicht sinnvoll für Uint16, wo es nur 2 Bytes sind.

Was ist der richtige Weg, um ein IEEE 754 Double in Netzwerk-Byte-Reihenfolge zu konvertieren?
Drehe ich alle 8 Bytes um oder kippe ich jede Hälfte einzeln um?

+0

@ M.M Der Code kommt direkt von einem anderen Beitrag. Die Hauptsache, auf die ich hinweisen möchte, ist, dass der Benutzer versucht, die ersten 4 Bytes des Double, gefolgt von den letzten 4 Bytes des Double zu spiegeln, anstatt alle 8 zusammen zu spiegeln. Ich möchte wissen, welche für die Netzwerk-Byte-Reihenfolge korrekt ist. –

+0

Mein Tipp wäre, diesen Beitrag zu downvoten und seinen Inhalt zu ignorieren –

+0

@ M.M Great. Also werden die SwapBytes an Shorts, Ints, Floats, Doubles, Long Longs usw. arbeiten? –

Antwort

1

Was ist der richtige Weg, um ein IEEE 754-Double in eine Netzwerk-Byte-Reihenfolge zu konvertieren?

Soweit ich sagen kann, gibt es keine Standard-Netzwerk-Byte-Reihenfolge für IEEE754 verdoppelt. Anscheinend haben die Leute ihre eigene Serialisierung gerollt.

Die "Netzwerk-Byte-Reihenfolge" entstand ursprünglich im Zusammenhang mit dem Internet Protocol, wo es üblich war, 32-Bit-Werte (IPv4-Adressen) und 16-Bit-Werte (z. B. Port-Nummer) zu senden. Die RFC 1700 ursprünglich definiert den Begriff, aber das RFC ist jetzt obsoleted ohne Ersatz.


Für die Kommunikation eines double oder anderen Daten für diese Angelegenheit, sollten beide Enden vereinbaren und folgen einem Protokollspezifikation. Dies wird sagen, wie das Doppel kodiert ist. Der Post, mit dem Sie verbunden sind, folgte vermutlich einem Protokoll, das das Platzieren der Bytes des IEEE754 64-Bit-Formats in der bestimmten Reihenfolge, die er zeigte, festlegte. Andere Protokolle können abweichen.

Verwandte Themen