22

このようなGUIDを作成しています

Guid g = new Guid(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF });
Console.WriteLine(g);

この出力

03020100-0504-0706-0809-0a0b0c0d0e0f

ウィキペディアによると、GUIDには4つの部分があり、これがバイト順序が4つのグループで切り替わる理由を説明しています。ただし、ウィキペディアの記事には、すべてのパーツがビッグエンディアン形式で保存されていることも記載されています。明らかに、最初の3つの部分はビッグエンディアンではありません。guidのGetBytes()メソッドは、作成に使用されたのとまったく同じ順序でバイトを返します。この動作の説明は何ですか?

4

2 に答える 2

11

MSは5つのパーツを構造に格納しているようです。最初の4つの部分は2バイトまたは4バイトの長さであるため、おそらくリトルエンディアン形式でネイティブタイプ(つまり、WORDおよびDWORD)として格納されます。最後の部分は6バイトの長さであるため、処理が異なります(おそらく配列)。

仕様には、GUIDがビッグエンディアンの順序で格納されている、またはパーツの格納はその順序であるが、個々のパーツは実装固有である可能性があると記載されていますか?

編集:

UUID仕様のセクション4.1.2から。レイアウトとバイトオーダー(強調鉱山):

オクテット内のビット割り当てに関する混乱を最小限に抑えるために、UUID
レコード定義は
、オクテットの整数であるフィールドに関してのみ定義されます。フィールドには、最も
重要なフィールドが最初に表示されます。

..。

反対の明示的なアプリケーションまたはプレゼンテーションプロトコル
の仕様がない場合、UUIDは次のように128ビットオブジェクトとしてエンコードされます。

フィールドは16オクテットとしてエンコードされ、フィールドのサイズと順序は上記で定義され、各フィールドは最上位バイトが最初にエンコードされます(ネットワークバイト順序と呼ばれます)。

MSがバイトを正しい順序で格納している可能性がありますが、ネットワークからホストへの順序でWORDとDWORDの部分を表示する必要はありません(少なくとも、私の熟練していない読み取りでは、仕様によれば問題ないようです。それ。)

于 2012-04-17T12:23:14.587 に答える
8

私はここでは専門家ではありませんが、あなたが言及しているWikiページにも次のように書かれています。

ただし、データ型の一般的に使用される[4]構造のリファレンスでは、バイト順序については言及されていません。

その引用([4])は、http://msdn.microsoft.com/en-us/library/aa373931( VS.85 ).aspxを指しており、その後、MicrosoftがGUIDを実装する方法を次のように識別します。

typedef struct _GUID {
  DWORD Data1;
  WORD  Data2;
  WORD  Data3;
  BYTE  Data4[8];
} GUID;

最後の8バイトはバイト配列として格納されているので、これはあなたが見ている振る舞いを識別していると思います。

于 2012-04-17T12:16:34.500 に答える