Pergunta

É que há uma maneira padrão aceito para UUIDs byte-swap para transmissão através de uma rede (armazenamento ou arquivo)? (Eu quero enviar / armazenar os 16 bytes brutos em vez de converter o UUID de uma representação string.)

No princípio pensei que eu deveria particionar o UUID em 4 32-bit inteiros e chamada htonl em cada um deles, mas isso não cheira bem. Um UUID tem a estrutura interna (a partir 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;

Seria correto fazer:

...
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 escrever, e então o correpsonding ntoh ... chamadas depois de ler na outra extremidade?

Graças.

Foi útil?

Solução

Sim, isso é a coisa certa a fazer.

Cada número (time_low, time_mid, time_hi_and_version) estão sujeitos a ordenação de bytes. o campo node não é. clock_seq_hi_and_reserved e clock_seq_low também estão sujeitos a ordenação de bytes, mas são cada um byte, por isso não importa.

É claro, é até você para se certificar de que você escolher a ordenação direito em ambas as extremidades, ou entender o que a ordenação é do outro lado, se você não controlá-lo. Microsoft, naturalmente, utiliza pouco endian para os seus UUIDs. Você pode ver definição de um UUID da Microsoft aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top