UUID e byte-swapping sulla rete
-
19-09-2019 - |
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.
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 .