2009-07-23 6 views
1

ネットワーク(またはファイルストレージ)を介して伝送するためのバイトスワップUUIDには、標準的に受け入れられている方法がありますか? (私は、16個の生のバイトを送信したいのですが、UUIDを文字列表現に変換するのではなく)。ネットワーク上のUUIDとバイトスワップ

私は最初にUUIDを4つの32ビット整数に分割し、それぞれにhtonlそれは正しいにおいがしませんでした。 ...書き込み、その後、ntoh correpsonding前

... 
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 */ 
.... 

他端に読んだ後に呼び出します。

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は、(RFC 4122から)の内部構造を有しています?

ありがとうございました。

答えて

3

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

各数字(time_low,time_mid,time_hi_and_version)は、バイトオーダーの対象です。 nodeフィールドはそうではありません。 clock_seq_hi_and_reservedclock_seq_lowもバイトオーダーの対象ですが、それぞれ1バイトなので問題ありません。

もちろん、両端で正しい順序を選択するかどうか、または順序を制御しないとその順序がどうなっているかを理解する必要があります。マイクロソフトはもちろんUUIDのリトルエンディアンを使用しています。あなたは、UUID hereのMicrosoftの定義を見ることができます。

+0

ありがとうございました。私は両端をコントロールしています。内部でホストの順序を選択するので、time_lowがリトルエンディアンで0x01020304と初期化され、ネットワーク経由で送信されると、もう一方の端でビッグエンディアンの値は0x01020304になります。 –

関連する問題