我正在创建这样的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()方法以与创建相同的顺序返回字节.这种行为的解释是什么?
似乎MS将五个部分存储在一个结构中.前4个部分长2或4个字节,因此可能以小端格式存储为本机类型(即WORD和DWORD).最后一部分是6个字节长,因此处理方式不同(可能是一个数组).
Spec是否声明GUID以big-endian顺序存储,或者部件的存储是否按顺序存在但单个部分可能是特定于实现的?
编辑:
从UUID规范,第4.1.2节.布局和字节顺序(强调我的):
为了最小化关于八位字节内的比特分配的混淆,UUID
记录定义仅根据
作为八位字节的整数的字段来定义.这些字段首先显示最
重要的字段....
在没有明确的应用程序或表示协议
规范的情况下,UUID被编码为128位对象,如下所示:这些字段被编码为16个八位字节,具有上面定义的字段的大小和顺序,并且每个字段首先用最高有效字节编码(称为网络字节顺序).
可能是MS已经以正确的顺序存储了字节,但是没有为网络到主机的顺序而烦恼WORD和DWORD部分进行演示(根据规范看似没问题,至少我的不熟练阅读它.)
我不是这里的专家,但你提到的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个字节存储为字节数组,我认为这可以识别您所看到的行为.