UUID и обмен байтами по сети
Существует ли стандартный принятый способ замены байтов UUID для передачи по сети (или хранилищу файлов)? (Я хочу отправить / сохранить 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... звонки после прочтения на другом конце?
Благодарю.
1 ответ
Да, это правильно.
Каждый номер (time_low
, time_mid
, time_hi_and_version
) подлежат байтовому упорядочению. node
поле нет. clock_seq_hi_and_reserved
а также clock_seq_low
также подчиняются порядку байтов, но каждый из них является байтом, так что это не имеет значения.
Конечно, это зависит от вас, чтобы убедиться, что вы выбрали правильный порядок на обоих концах, или понять, каков порядок на другом конце, если вы не контролируете его. Microsoft, конечно, использует в своем UUID переменный порядок байтов. Вы можете увидеть определение UUID от Microsoft здесь.