Domanda

è che ci sono un modo accettato standard per byte-swap UUID per la trasmissione su una rete (o l'archiviazione di file)? (Voglio inviare / memorizzare i 16 byte prime, piuttosto che convertire l'UUID ad una rappresentazione di stringa.)

ho pensato in un primo momento avrei dovuto dividere l'UUID in 4 interi a 32 bit e chiamare htonl su ciascuno di loro, ma che non ha odore giusto. Un UUID ha struttura interna (da 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;

Sarebbe corretto fare:

...
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 */
....

prima di scrivere, e poi l'atto sui temi ntoh ... chiamate dopo aver letto all'altro capo?

Grazie.

È stato utile?

Soluzione

Sì, questa è la cosa giusta da fare.

Ogni numero (time_low, time_mid, time_hi_and_version) sono soggetti a ordinamento dei byte. il campo node non lo è. clock_seq_hi_and_reserved e clock_seq_low sono inoltre soggetti a ordinamento di byte, ma ciascuno di essi è un byte, quindi non importa.

Naturalmente, spetta a voi per assicurarsi che si sceglie l'ordinamento a destra su entrambe le estremità, o capire che cosa l'ordinamento è all'altro capo del filo, se non si controllano. Microsoft, naturalmente, utilizza little endian per i loro UUID. È possibile vedere la definizione di Microsoft di un UUID qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top