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 здесь.

Другие вопросы по тегам