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.

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top