Вопрос

Существует ли стандартный принятый способ обмена 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 здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top