UUIDs und Byte-Swapping über das Netzwerk
-
19-09-2019 - |
Frage
Ist es ein Standard akzeptierte Art und Weise auf Byte-Swap-UUIDs für die Übertragung über ein Netzwerk (oder Dateispeicher)? (Ich möchte senden / speichern die 16 rohe Bytes statt wandeln die UUID in eine String-Darstellung.)
dachte ich zuerst sollte ich die UUID in 4 32-Bit-Integer partitionieren und rufen htonl auf jeden von ihnen, aber das hat nicht riechen richtig. Ein UUID hat interne Struktur (von RFC 4122):
typedef struct {
unsigned32 time_low;
unsigned16 time_mid;
unsigned16 time_hi_and_version;
unsigned8 clock_seq_hi_and_reserved;
unsigned8 clock_seq_low;
byte node[6];
} uuid_t;
Wäre es richtig zu tun:
...
uuid.time_low = htonl( uuid.time_low );
uuid.time_mid = htons( uuid.time_mid );
uuid.time_hi_and_version = htons( uuid.time_high_and_version );
/* other fields are represented as bytes and shouldn't be swapped */
....
vor dem Schreiben, und dann wird der Korrespondenzpartner ntoh ... rufe nach am anderen Ende zu lesen?
Danke.
Lösung
Ja, das ist die richtige Sache zu tun.
Jede Nummer (time_low
, time_mid
, time_hi_and_version
) unterliegen der Byte-Reihenfolge. das node
Feld nicht. clock_seq_hi_and_reserved
und clock_seq_low
sind auch Byteanordnung Thema, aber sie sind jeweils ein Byte, so dass es keine Rolle spielt.
Natürlich ist es an Ihnen, um sicherzustellen, dass Sie die richtige Reihenfolge an beiden Enden wählen, oder verstehen, was die Ordnung am anderen Ende ist, wenn Sie nicht kontrollieren. Microsoft natürlich verwendet Little-Endian für ihre UUIDs. Sie können Microsofts Definition eines UUID finden Sie unter hier .