UUID et byte-swapping sur le réseau
-
19-09-2019 - |
Question
Est il y a un moyen standard acceptée à l'octet swap UUID pour la transmission sur un réseau (ou le stockage de fichiers)? (Je veux envoyer / stocker 16 octets bruts plutôt que de convertir l'UUID à une représentation de chaîne.)
Je pensais tout d'abord je partitionner le UUID en 4 entiers de 32 bits et appeler htonl sur chacun d'eux, mais cela ne sentait pas bon. Un UUID a une structure interne (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;
Serait-il correct de le faire:
...
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 */
....
avant d'écrire, puis le correpsonding ntoh ... après avoir lu les appels à l'autre bout?
Merci.
La solution
Oui, c'est la bonne chose à faire.
Chaque numéro (time_low
, time_mid
, time_hi_and_version
) sont soumis à l'ordre des octets. le champ node
n'est pas. clock_seq_hi_and_reserved
et clock_seq_low
sont également soumis à l'ordre des octets, mais ils sont chacun un octet, il n'a pas d'importance.
Bien sûr, il est à vous pour vous assurer que vous choisissez la commande à droite sur les deux extrémités, ou à comprendre ce que l'ordre est à l'autre bout si vous ne contrôlez pas. Microsoft utilise bien sûr peu endian pour leurs UUID. Vous pouvez voir la définition de Microsoft d'un UUID .