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.

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top