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

根据维基百科,指南中有四个部分,这解释了为什么字节顺序在四组中切换。但是,Wikipedia 文章还指出,所有部分都以 Big Endian 格式存储。显然前三部分不是Big Endian。guid 的 GetBytes() 方法以与创建时相同的顺序返回字节。这种行为的解释是什么?

4

2 回答 2

11

似乎 MS 将这五个部分存储在一个结构中。前 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 回答