.NET中的Guid字节顺序

Sti*_*gar 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);
Run Code Online (Sandbox Code Playgroud)

这输出

03020100-0504-0706-0809-0a0b0c0d0e0f
Run Code Online (Sandbox Code Playgroud)

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

Grh*_*rhm 8

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

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

编辑:

UUID规范,第4.1.2节.布局和字节顺序(强调我的):

为了最小化关于八位字节内的比特分配的混淆,UUID
记录定义仅根据
作为八位字节的整数的字段来定义.这些字段首先显示最
重要的字段.

...

没有明确的应用程序或表示协议
规范的情况下
,UUID被编码为128位对象,如下所示:

这些字段被编码为16个八位字节,具有上面定义的字段的大小和顺序,并且每个字段首先用最高有效字节编码(称为网络字节顺序).

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


pms*_*969 6

我不是这里的专家,但你提到的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;
Run Code Online (Sandbox Code Playgroud)

由于最后8个字节存储为字节数组,我认为这可以识别您所看到的行为.