UUID e ao longo da rede de troca de bytes
-
19-09-2019 - |
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.
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 .