当前位置: 首页 > 知识库问答 >
问题:

.NET 中的 GUID 字节顺序

易琨
2023-03-14

我正在创建一个这样的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

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

共有2个答案

林修真
2023-03-14

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

然而,对常用[4]数据类型结构的引用没有提到字节排序

该引文([4])指向http://msdn.microsoft.com/en-us/library/aa373931(对比85)。aspx,它随后标识了Microsoft如何将GUID实现为

typedef struct _GUID {
  DWORD Data1;
  WORD  Data2;
  WORD  Data3;
  BYTE  Data4[8];
} GUID;

由于最后8个字节存储为字节数组,我认为这标识了您看到的行为。

怀飞扬
2023-03-14

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

规范是否声明 GUID 按大端顺序存储,或者部件的存储按该顺序存储,但单个部件可能是特定于实现的?

编辑:

根据UUID规范,第4.1.2节。布局和字节顺序(强调矿):

为了尽量减少对八位字节内的位分配的混淆,UUID
记录定义仅根据八位字节的整数字段定义。字段首先显示最
重要的字段。

...

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

字段被编码为16个八位字节,字段的大小和顺序如上所述,每个字段首先用最高有效字节(称为网络字节顺序)编码。

可能是 MS 以正确的顺序存储了字节,但没有费心对 WORD 和 DWORD 部分进行网络到主机的排序以进行演示(根据规范这似乎是可以的,至少通过我不熟练的阅读它。

 类似资料:
  • 问题内容: 我需要将.NET中生成的Guid传达给Java应用程序。我曾经以的形式将其存储在磁盘上,然后将其读入Java并将其转换为UUID。为此,我复制了UUID的(私有)构造函数的实现,该实现采用: 但是,当我使用检查UUID时,Java UUID与.NET Guid不同。 例如,.NET Guid 变成Java UUID 看起来前三组的字节顺序是相反的,而后两组的顺序是相同的。 由于我希望G

  • 我有生成SHA-1哈希的代码: 有没有办法将< code>hash转换成Guid(我猜是type 5,以便与SHA-1保持一致)?

  • 问题内容: 这是我正在查看的表的简化版本: 我想在此表中插入新记录。我尝试了3种方法: 这种方法会插入,但是生成的键与表中的其他键不同,不是一个很好的顺序GUID 这失败并显示错误 newsequentialid()内置函数只能在CREATE TABLE或ALTER TABLE语句中的’uniqueidentifier’类型的列的DEFAULT表达式中使用。它不能与其他运算符组合以形成复杂的标量表

  • 问题内容: 下面是我的代码,该代码代替了DataInputStream来包装InputStream,但除了读取大字节序类型的常规方法之外,还提供了额外的方法来读取小字节序数据类型。随意使用它。 我有以下几点保留意见。请注意不会更改功能的方法(读取大端类型的功能)。我无法将DataInputStream实现为基类并使用其方法,如read(),readInt(),readChar()等吗? 我的班级层

  • 问题内容: 我正在尝试使用Java读取CSV文件。有些文件的开头可能有字节顺序标记,但不是全部。如果存在,字节顺序将与第一行的其余部分一起读取,从而导致字符串比较出现问题。 是否存在一种跳过字节顺序标记的简单方法? 问题答案: 你正在以这种方式使用它:

  • 我的问题主要与命令有关。如您所见,在“1:”处,生成的字节码是。在本例中,为什么使用,而不是或?我们可以看到,稍后在“11:”中使用,而不使用。这有什么原因吗,为什么开始时使用变量2,后来使用变量1? 抱歉,如果上面的措辞不好,我现在才开始在大学里学习Java字节码。 此外,我还试图从我们必须学会使用的列表中找出哪些命令使用了一个以上的字节。这是列表,有人能验证下面命令中的“字节用法”(我不确定正