我正在创建像这样的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()方法以与创建相同的顺序返回字节。这种行为的解释是什么?
答案 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个字节存储为字节数组,我认为这可以识别您所看到的行为。