UUID y byte-swapping través de la red
-
19-09-2019 - |
Pregunta
es que hay una forma aceptada estándar de permutación de octeto UUID para su transmisión por una red (o el almacenamiento de archivos)? (Quiero enviar / guardar los 16 bytes primas en lugar de convertir el UUID de una representación de cadena.)
Al principio pensé que debería dividir el UUID en 4 enteros de 32 bits y llame htonl en cada uno de ellos, pero eso no huele bien. Un UUID tiene estructura interna (de 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;
¿Sería correcto hacer:
...
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 */
....
Antes de escribir, y luego el correpsonding ntoh ... llama después de leer en el otro extremo?
Gracias.
Solución
Sí, eso es lo correcto a hacer.
Cada número (time_low
, time_mid
, time_hi_and_version
) están sujetos a la orden de los bytes. el campo node
no lo es. clock_seq_hi_and_reserved
y clock_seq_low
también son objeto de orden de bytes, pero son cada uno un byte, por lo que no importa.
Por supuesto, depende de usted para asegurarse de que usted elija el orden correcto en ambos extremos, o no entiende lo que es el orden en el otro extremo si no se controlan. Microsoft, por supuesto, utiliza poca endian por sus UUID. Puede ver la definición de un UUID de Microsoft aquí .