1

ネットワーク (またはファイル ストレージ) 経由で送信するために UUID をバイト スワップする標準的な方法はありますか? (UUID を文字列表現に変換するのではなく、生の 16 バイトを送信/保存したい。)

最初は、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... が反対側で読み取り後に呼び出されますか?

ありがとう。

4

1 に答える 1

3

はい、それは正しいことです。

各番号(time_low、、 )time_midtime_hi_and_versionバイト順序の対象となります。nodeフィールドはそうではありません。clock_seq_hi_and_reservedまたclock_seq_low、バイト順序の対象にもなりますが、それぞれ1バイトであるため、問題ではありません。

もちろん、両端で正しい順序を選択するか、制御しない場合はもう一方の端で順序を理解するかはあなた次第です。もちろん、MicrosoftはUUIDにリトルエンディアンを使用しています。MicrosoftのUUIDの定義はここで確認できます。

于 2009-07-23T06:18:35.517 に答える