UUID и обмен байтами по сети
-
19-09-2019 - |
Вопрос
Существует ли стандартный принятый способ обмена UUIDS байтами для передачи по сети (или файловому хранилищу)?(Я хочу отправить / сохранить 16 необработанных байт, а не преобразовывать UUID в строковое представление.)
Сначала я думал, что мне следует разбить UUID на 4 32-битных целых числа и вызвать htonl для каждого из них, но это было неправильно.UUID имеет внутреннюю структуру (из 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;
Было бы правильно сделать:
...
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 */
....
перед записью, а затем соответствующий ntoh ... вызывает после чтения на другом конце?
Спасибо.
Решение
Да, это правильный поступок.
Каждое число (time_low
, time_mid
, time_hi_and_version
) подлежат упорядочению в байтах.в node
поле - это не так. clock_seq_hi_and_reserved
и clock_seq_low
также могут быть упорядочены по байтам, но каждый из них состоит из одного байта, так что это не имеет значения.
Конечно, от вас зависит убедиться, что вы выбрали правильный порядок на обоих концах, или понять, каков порядок на другом конце, если вы его не контролируете.Microsoft, конечно, использует маленький порядковый номер для своих UUID.Вы можете ознакомиться с определением UUID от Microsoft здесь.