.NET中的Guid字节顺序

时间:2012-04-17 11:59:16

标签: .net guid

我正在创建像这样的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,guid中有四个部分,这解释了为什么字节顺序在四组中切换。然而,维基百科文章还指出所有部分都以Big Endian格式存储。显然前三部分不是Big Endian。 guid的GetBytes()方法以与创建相同的顺序返回字节。这种行为的解释是什么?

2 个答案:

答案 0 :(得分:7)

MS似乎将五个部分存储在一个结构中。 前4个部分长2或4个字节,因此可能以小端格式存储为本机类型(即WORD和DWORD)。最后一部分长度为6个字节,因此处理方式不同(可能是一个数组)。

规范是否声明GUID以big-endian顺序存储,或者部件的存储是否按顺序存在但单个部分可能是特定于实现的?

编辑:

来自UUID spec,第4.1.2节。布局和字节顺序(强调我的):

  

为了最大限度地减少八位字节内位分配的混淆,UUID
  记录定义仅根据字段来定义   八位组的整数。字段最多呈现   首先是重要的。

     

...

     

缺乏明确的应用或演示协议
  相反的规范
,UUID被编码为128位对象,   如下:

     

字段编码为16个八位字节,大小和顺序为   上面定义的字段,每个字段用Most编码   首先是重要的字节(称为网络字节顺序)。

可能是MS已经以正确的顺序存储了字节,但是没有为网络到主机的顺序打扰WORD和DWORD部分进行演示(根据规范,这似乎没问题,至少是我的不熟练的阅读。)

答案 1 :(得分:6)

我不是这里的专家,但你提到的Wiki页面也说:

  

然而,通常[4]使用的数据结构的参考   type没有提到字节排序

该引文([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个字节存储为字节数组,我认为这可以识别您所看到的行为。